1. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
(1)迭代
- 1.新建一个链表用于跟踪节点,指向head
- 2.节点1指向节点3,节点2指向节点1,完成一次交换,继续循环
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode zero = new ListNode(0);
zero.next = head;
ListNode temp = zero;
while (temp.next != null && temp.next.next != null) {
ListNode one = temp.next;
ListNode two = temp.next.next;
temp.next = two;
one.next = two.next;
two.next = one;
temp = one; //这时的排序是2,1,3,4。one在3的前面,相当于是zero
}
return zero.next;
}
}
(1)正序递归
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode Three = head.next.next;
ListNode two = head.next;
two.next = head;
head.next = swapPairs(Three);
return two;
}
}
(2)倒序递归
-
找终止条件:什么情况下递归终止?没得交换的时候,递归就终止了呗。因此当链表只剩一个节点或者没有节点的时候,自然递归就终止了。
-
找返回值:我们希望向上一级递归返回什么信息?由于我们的目的是两两交换链表中相邻的节点,因此自然希望交换给上一级递归的是已经完成交换处理,即已经处理好的链表。
-
本级递归应该做什么: 结合第二步,看下图!由于只考虑本级递归,所以这个链表在我们眼里其实也就三个节点:head、head.next、已处理完的链表部分。而本级递归的任务也就是交换这3个节点中的前两个节点,就很easy了。
class Solution {
public ListNode swapPairs(ListNode head) {
//终止条件:链表只剩一个节点或者没节点了,没得交换了。返回的是已经处理好的链表
if (head == null || head.next == null) {
return head;
}
//一共三个节点:head, next, swapPairs(next.next)
//下面的任务便是交换这3个节点中的前两个节点
ListNode next = head.next;
head.next = swapPairs(next.next);
next.next = head;
//1的下一个值是4,所以这里需要返回交换的后一个值
return next;
}
}