📝个人主页:五敷有你
🔥系列专栏:算法分析与设计
⛺️稳中求进,晒太阳
题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
思路
这里我们需要三个指针,p,q,temp。
假设链表是
1->2->3->4->5->6
在迭代的时候,每次处理两个节点,于是第一轮 p指向 1,q 指向 2。
第二轮的时候 p 指向 3,q 指向 4。第三轮的时候 p 指向 5,q 指向 6。
我们通过 a.next = b.next,以及b.next=a就把两个指针的位置反转了,于是1->2就变成2->1。
但这里有一个细节需要处理,当我们第二轮迭代的时候,p 指向 3,q 指向 4。按照题目要求,最终应该是2->1->4->3。
也就是节点 1 需要跟节点 4 串起来,只有两个指针就没法弄了,所以需要第三个指针 tmp,用来记录上一轮 p 的位置,然后下一轮迭代的时候,将原先的 p(也就是节点 1)指向 4。
1.初始化:
申请一个节点,方便后续操作。
2. p指向1 q指向2
3. tmp.next = b; a.next = b.next; (操作过程中不要丢失节点)
现在节点的顺序是2 1 3 4
不好看,那我转一下(是不是清晰多了) ,一次调换两个节点
4. 接下来 temp和p q指向 1 ,来操作后两个节点,
代码实现
/**
* 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) {
if(head==null){
return null;
}
ListNode pre=new ListNode(-1);
ListNode p=pre;
ListNode q=pre;
pre.next=head;
ListNode temp=pre;
while(q!=null&&q.next!=null&&q.next.next!=null){
p=p.next;
q=q.next.next;
temp.next=q;
p.next=q.next;
q.next=p;
temp=p;
q=p;
}
return pre.next;
}
}