持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
解题思路
本题一看就是考察的链表,需要将两两节点交换位置。因为交换了位置后第二个节点就是头节点所以我们需要
- 先创一个空节点,空节点的next节点指向head节点。
- 现在的第二个节点就是之前的第一个节点了,然后我们将值为1的节点的next节点指向值为3节点,
- 将值为2的节点的next指向值为1的节点,
注意这两部的顺序不能反,否则就会出现死循环了。
4.将ans节点的next节点指向值为2的节点
然后依次类推。注意刚开始的时候要判断head是否为空,否则head.next就会报错
代码
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null) return head;
ListNode ans = new ListNode(0,head);
ListNode curr = ans;
ListNode next = curr.next;
ListNode next2 = next.next;
while (next != null && next2 != null) {
ListNode next3 = next2.next;
next.next = next3;
next2.next = next;
curr.next = next2;
curr = next;
next = next3;
if (next != null) {
next2 = next.next;
}
}
return ans.next;
}
}
总结
就是链表就换两个节点的升级版,需要理清思路,可以在本子上画一画,注意不要造成死循环和一些空值的判断,因为空值的next就没有数据了,会报错的。