Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
来源:力扣(LeetCode)
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。 你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围 [0, 100] 内
- 0 <= Node.val <= 100
二丶思路分析
通过迭代的方式实现两两交换链表中的节点
- 创建一个哑哨节点
dummyHead指向head - 初始化一个当前节点
curTempNode等于dummyHead - 每次交换
curTempNode后面的两个节点l1和l2 - 当
curTempNode后面存在少于两个节点时候,停止。 - 更新当前节点
curTempNode
三、代码实现
/**
* 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 dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode curTempNode = dummyHead;
while (curTempNode.next != null && curTempNode.next.next != null){
ListNode l1 = curTempNode.next;
ListNode l2 = curTempNode.next.next;
//交换 l1 l2节点
curTempNode.next = l2;
l1.next = l2.next;
l2.next = l1;
curTempNode = l1;
}
return dummyHead.next;
}
}
复杂度分析
- 时间复杂度:,其中
n是链表的节点数量 - 空间复杂度:
运行结果
总结
这个题目就是通过迭代或者一个递归,来完成两两节点的交换。
主要还是在对于链表的使用的联系。思路还是很容易理解的。
再接再厉,继续加油~~