24. Swap Nodes in Pairs
题目
给出一个链表,交换每两个相邻的结点,并返回它的头结点。
比如:
给出 1->2->3->4, 你应该返回 2->1->4->3.
注意:
你的算法应该只用常数额外空间。
你可能并不修改列表结点的值,仅改变节点本身。
代码块
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) return head;
ListNode fakeHead = new ListNode(0);
fakeHead.next = head;
ListNode pre = fakeHead;
ListNode left = head;
ListNode right = head.next;
while(right.next != null && right.next.next != null){
left.next = right.next;
right.next = left;
pre.next = right;
left = left.next;
right = right.next.next.next;
pre = pre.next.next;
}
left.next = right.next;
right.next = left;
pre.next = right;
return fakeHead.next;
}
}
代码分析
本题刚开始没有思路,debug一遍后才慢慢理清思绪。
本题的重点是要分析循环结束的条件。
1.首先设置三个结点;
还要注意边界条件。以及设定哑变量(头结点位置会改变)。
2.然后满足条件的进行循环;(包含图中步骤1-6)
在循环中,先交换位置,然后将三个结点进行移位。
3.最后,做收尾处理。(包含图中步骤7-9)
做链表的题目时一定注意,要画一下位置,不然容易混乱。
步骤1,2,3是交换结点,4,5,6是将三个结点进行移位,7,8,9是做收尾处理。