0.题目
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
提示:
- 链表中节点的数目在范围 [0, 100] 内
- 0 <= Node.val <= 100
1.分析
1.1普通解法之分析
常规解法是从列表的头到尾依次交换相邻两个节点。
此处相邻节点
初始链表:1 -->2 -->3 -->4 -->5 --> null
此处有三个指针:
- 指针a: 指向第一个节点;需要与指针b的节点交换;
- 指针b: 指向第二个节点;需要与指针a的节点交换;
- 指针temp: 指向每次交换的头指针;【这个指针不可省略】
第一次交换的过程:
整理之后的样子:
第二次交换的过程:
整理之后的样子:
1.2迭代发之分析
主要思路:
- 相邻节点交换,递归直到尾节点;
- 下层递归返回是上层递归的next节点;
- 最终返回递归1的temp节点;
简易图:
2.解法
2.1普通解法:0ms 35.8MB
public ListNode swapPairs1(ListNode head) {
if (head == null || head.next == null) return head;
ListNode pre = new ListNode(0);
pre.next = head;
ListNode a = pre;
ListNode b = pre;
ListNode temp = pre;
while (b != null && b.next != null && b.next.next != null) {
a = a.next;
b = b.next.next;
temp.next = b;
a.next = b.next;
b.next = a;
temp = a;
b = a;
}
return pre.next;
}
2.2迭代解法: 0ms 36.1MB
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) return head;
ListNode temp = head.next;
head.next = swapPairs(temp.next);
temp.next = head;
return temp;
}