一、题目描述
原文链接:两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
输出:[1]
分析:简单的说,就是两个节点一组,每组内部结点交换顺序,最后相连!
二、思路分析
这道题就是考察对链表的熟悉程度!做拉N次,看看提示才通过的!怎么做那,我们用图说话把!
需要注意的是三点
- 第一点就是循环条件,从上图可以看出来用到啦
next,next.next
,所以说如果next != null && next.next != null
则可以一直进行步骤一到三的循环!; - 第二点就是没有元素和只有一个元素
[]和[1]
,则需要进行if (head == null || head.next == null) return head;
; - 第三点就是给链表加一个虚拟头节点,这样的话不需要单独考虑前面的,所有规律都一样!但是最后的结果要返回虚拟头节点的next;
三、AC代码
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode pre = new ListNode(-1, head);
ListNode nummy = pre;
ListNode cur = pre.next;
while (cur != null && cur.next != null) {
ListNode next = cur.next;
pre.next = next;
cur.next = next.next;
next.next = cur;
pre = cur;
cur = cur.next;
}
return nummy.next;
}
}
四、总结
- 做链表题目可以考虑添加虚拟节点
- 通过处理逻辑分析出循环条件(用到啦next与next.next,推出来next != null && next.next != null)
感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤