One minute
Week1031_algorithm
ARTS - Algorithm 补2019.2.6
[24. 两两交换链表中的节点]
题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
分析
这道题要两两交换,且是节点实际交换,那么就是操作指针了。交换节点操作指针时候的重点是不能丢了指向,就是 1、2交换不能丢失他们后继 3,而且,交换后也不能忘了3 的前驱是1,因此我们要保留四个节点:
Prev -> node -> node.next -> node.next.next
可以给开头一个假的节点,作为第一个前驱。所以操作步骤如下:
- 建立假头部指向链表,这个假头部当做prev。
- 建立三个指针指向当前、当前的后继、当前的后继的后继
- 操作指向
- 前驱指向第二个节点
- 第一个节点指向第三个节点
- 第二个节点指向第一个节点
- 当前指针向前推进
代码
public static ListNode swapPairs(ListNode head) {
ListNode prev = new ListNode(0);
prev.next = head;
head = prev;
ListNode node = prev.next;
while (node != null && node.next != null) {
// 保存三个
ListNode first = node;
ListNode second = node.next;
ListNode third = node.next.next;
prev.next = second;
first.next = third;
second.next = first;
// 这时的node已经是交换过的node了,所以推动前驱就是指向这个第二个node
prev = node;
// 此时只需要往前推动一步就跳过了这一对节点
node = node.next;
}
return head.next;
}
Read other posts