给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] | |
输出:[2,1,4,3] |
示例 2:
输入:head = [] | |
输出:[] |
示例 3:
输入:head = [1] | |
输出:[1] |
提示:
- 链表中节点的数目在范围 [0, 100] 内
- 0 <= Node.val <= 100
题解
class Solution { | |
/** | |
* 1->2->3->4 | |
* p:0->1->2->3->4 | |
* before = p.next = 1 | |
* after = p.next.next = 2 | |
* 交换 | |
* 第一步,由 1 指向 3:before.next = after.next | |
* 第二步,由 0 指向 2:p.next = after | |
* 第三步,由 2 指向 1:after.next = before | |
* 当前链条:0->2->1->3->4 | |
* 交换完成,下次循环 p 从 1 开始交换后面的元素:p = before | |
* p: 1->3->4 | |
*/ | |
public ListNode swapPairs(ListNode head) { | |
// 当链表为空时或者只有一个值时返回当前链表 | |
if (head == null || head.next == null) return head; | |
// 创建首节点指向 head | |
ListNode result = new ListNode(0, head); | |
// 遍历的节点 | |
ListNode p = result; | |
// 是否存在两个节点可交换 | |
while (p.next != null && p.next.next != null){ | |
// 待交换的两值 | |
ListNode before = p.next; | |
ListNode after = p.next.next; | |
// 交换 | |
before.next = after.next; | |
p.next = after; | |
after.next = before; | |
// 下一次交换的起点 | |
p = before; | |
} | |
return result.next; | |
} | |
} |
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/swap-nodes-in-pairs