题目:
leetcode 24.Swap Nodes in Pairs (Medium)
Given a linked list, swap every two adjacent nodes and return its head.
You may not modify the values in the list’s nodes, only nodes itself may be changed.
Example:
Given 1->2->3->4, you should return the list as 2->1->4->3.
题目大意:
将给定链表中的结点两两交换,并返回交换后的链表;
要将实际的结点进行交换,而不是单纯改变结点内部的值。
解题思路:
本题也有iteratively和recursively的两种解法。
iteratively做法重要的是要记住两两交换的结点位置,用l1和l2记住,同时添加一个虚拟的头结点更方便循环。循环时要注意下一次操作时的对应循环结点结点和最终链表的链接结点。
recursively的代码重要的是确定出需要交换了两个结点。递归代码相当的巧妙,是理解递归的很棒的例子。
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33Java:
Iteratively:
public ListNode swapPairs(ListNode head){
if(head == null || head.next == null) return null;
ListNode newHead = new ListNode(0);
newHead.next = head;
ListNode pre = newHead;
while(pre.next != null && pre.next.next != null){
ListNode l1 = pre.next, l2 = pre.next.next;
ListNode next = l2.next;
l2.next = l1;
l1.next = next;
//接下来保证链表始终连续,pre指针就要调整指向和next指向
pre.next = l2;
pre = l1;
}
return newHead.next; //这里直接返回head结果是不对的,因为head对应的结点也已经调换了位置。
}
recursively:
public ListNode swapPairs(ListNode head){
if(head == null || head.next == null) return null;
ListNode firstNode = head;
ListNode secondNode = head.next;
//这种写法是后递归,先处理局部,再递归
firstNode.next = swapPairs(secondNode.next); //注意这里是secondNode.next,才能满足递归
secondNode.next = firstNode;
return secondNode;
}