LeetCode题目:Swap Nodes in Pairs
题目概述
Given 1->2->3->4,
Return 2->1->4->3.
解题方法
- 迭代
public ListNode swapPairs(ListNode head) {
if (head==null || head.next==null) {
return head;
}
ListNode pre = new ListNode(-1);
ListNode next = null;
ListNode newHead = head.next;
while (head!=null && head.next!=null) {
next = head.next.next; (1)
pre.next = head.next; (2)
head.next.next = head; (3)
head.next = next; (4)
pre = head; (5)
head = next; (6)
}
return newHead;
}
思路:完成顺序交换,同时要记录下一组节点的开始节点和前一组节点的结束节点。
(1)循环下次进入的head节点为:当前head节点的下一个的下一个节点,即: ‘3’ ;
(2)将定义的前节点指向交换顺序之后排在前面的节点,即: ‘2’ ;
(3)交换顺序,即改变指向:‘2’ 一> ‘1’;
(4)将交换顺序之后排在后面的节点指向链表正常顺序的后序节点,即: ‘1’ 一> ‘3’;
(5)记录当前组的结束节点;
(6)将head指向下一组节点的开始节点,进入下一轮循环。
- 递归
public ListNode swapPairs(ListNode head) {
if (head==null || head.next==null) {
return head;
}
ListNode next = head.next; (1)
head.next = swapPairs(head.next.next); (2)
next.next = head; (3)
return next; (4)
}
思路:
(1)记录该组当前节点的下一个节点,即: ‘2’ ;
(2)该步为整个算法的核心,重点在于思想的理解:将head节点(此时将head节点当做是交换顺序之后的位置了,所以head节点需指向下一组节点)指向下一组交换顺序之后的开始节点。即该方法需返回 ‘4’,此时顺序为 ‘1’ 一> ‘4’;
此处不需要深究方法怎么实现,只需要知道:该方法得到的是下一组节点交换顺序之后的开始节点。
(3)交换顺序,即 ‘2’ 一> ‘1’ ,此时顺序为:‘2’ 一> ‘1’ 一> ‘4’;
(4)因为在步骤2时需要的返回值是交换顺序之后的开始节点,所以此处返回 next,即步骤1记录的节点。