给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
题解:
法一:正常模拟
代码实现
/**
* 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 dumyHead = new ListNode(-1);
// 利用此虚拟头节点指向头节点以记录变化后的链表
dumyHead.next = head;
// cur 此时指向的是head的前一个元素
ListNode cur = dumyHead;
ListNode firstNode = null;
ListNode secondNode = null;
ListNode temp = null;
while(cur.next != null && cur.next.next != null) {
// 进行两元素(firstNode 和 secondNode 之间的交换)
firstNode = cur.next;
secondNode = cur.next.next;
temp = cur.next.next.next;
cur.next = secondNode;
secondNode.next = firstNode;
firstNode.next = temp;
// 更改cur 的位置,使其指向下一块需要交换位置的两元素之前
cur = firstNode;
}
// 返回之前利用虚拟头节点记录的链表头
return dumyHead.next;
}
}
法二:递归调用(有些难以理解,需要debug辅助理解)
代码实现
/**
* 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) {
// baseCase 退出提交
if(head == null || head.next == null) {
return head;
}
// 获取head的下一个元素,其后会使其与head位置元素交换
ListNode next = head.next;
// 进入递归
ListNode newNode = swapPairs(next.next);
next.next = head;
head.next = newNode;
return next;
}
}