链表交换节点图解

不同于数组,链表交换节点主要是改变各种指针的指向,趁着有时间,撸了个示意图,便于直观地理解,用OmniGraffle画了几个图,画的丑莫喷...
先定义几个结点,我们要交换node1和node2

链表交换节点图解_第1张图片
1

单向链表交换节点

  • 先上代码
     ListNode temp = node1.next;
     node1.next = temp.next;
     temp.next = preNode.next;
     preNode.next = temp;

下面逐行进行分析:

ListNode temp = node1.next;

node1.next即node2,那么temp=node2,即temp.next=nextNode;

链表交换节点图解_第2张图片
2

node1.next = temp.next;

temp.next=nextNode,即node1.next=nextNode

链表交换节点图解_第3张图片
3

temp.next = preNode.next;

从前面我们可以知道,temp=node2,所以这句话等价于
node2.next=preNode.next=node1

链表交换节点图解_第4张图片
4

preNode.next = temp;

这句话等价于
preNode.next=node2
temp完成交换失去作用了

链表交换节点图解_第5张图片
5

双向链表交换节点

先上交换节点代码:

node1.back.next=node2;
node2.back=node1.back;
node2.next.back=node1;
node1.next=node2.next;
node2.next=node1;
node1.back=node2;

示意图

链表交换节点图解_第6张图片
1

node1.back.next=node2;

preNode.next=node2,

链表交换节点图解_第7张图片
2

node2.back=node1.back;

即node2前驱指向preNode

链表交换节点图解_第8张图片
3

node2.next.back=node1;

即nextNode前驱指向了node1

链表交换节点图解_第9张图片
4

node1.next=node2.next;

即node1的后继指向了nextNode

链表交换节点图解_第10张图片
5

node2.next=node1;

node2的后继指向了node1


链表交换节点图解_第11张图片
6

node1.back=node2;

node1的前驱指向node2

链表交换节点图解_第12张图片
7

把每组前驱后继改成相同颜色:

链表交换节点图解_第13张图片
8

你可能感兴趣的:(链表交换节点图解)