24.两两交换链表中的节点
问题:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
输入:head = []
输出:[]
输入:head = [1]
输出:[1]
思路: 参考:代码随想录
- 双指针–迭代版本
重点在节点交换 注意学习 while条件以及双指针的位置,双指针这样放使得操作会方便好多。
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode prev = dummy;
ListNode cur = head;
while(prev.next != null && prev.next.next != null){
ListNode next = cur.next.next;
prev.next = cur.next;
cur.next.next = cur;
cur.next = next;
prev = cur;
cur = cur.next;
}
return dummy.next;
}
}
- 递归版本
递归还是强调一句话:明确递归函数含义,不要深入细节
class Solution {
public ListNode swapPairs(ListNode head) {
//base case
if(head == null || head.next == null){
return head;
}
//记录当前节点的后继节点
ListNode next = head.next;
//将其后继节点之后的链表两两交换 注意 是交换其后继节点之后的子链表 不包含这个后继节点
ListNode newNext = swapPairs(next.next);
//两两交换
//next的后继节点为当前节点
next.next = head;
//当前节点的后继节点为后面子链表交换后返回的头节点
//所以需要将后面的子链表先交换,再交换当前的两个节点
head.next = newNext;
return next;
}
}
整理思路,记录博客,以便复习。若有误,望指正~