此题为力扣中等链表题目
📌 文章目录:
题目:
1️⃣.题目解析
题目要求交换两个相邻的交点,该题需要使用一个傀儡结点在不改变结点数值的情况下实现交换,使用傀儡结点依次去把结点重新串联起来,最后返回新链表的头即可
2️⃣.代码实现+图解
步骤一、定义一个傀儡结点,由于其数值域没有任何意义,所以这里把傀儡结点的数值设置为 1
ListNode newHead = new ListNode(-1);
步骤二、设置一个 tmp 用于去遍历链表
ListNode tmp = newHead;
步骤三、将傀儡结点和原链表的头链接起来
newHead.next = head;
步骤四、判断后面串联的两个结点是否还存在,如果存在进入循环,如果后面只有一个结点或者没有结点了,循环结束
while(tmp.next != null && tmp.next.next != null)
步骤五、待交换的两个结点(由于每次交换的结点都不相同所以每次循环都要进行更新)
ListNode node1 = tmp.next;
ListNode node2 = tmp.next.next;
步骤六、实现交换并把依次按照要求把结点串联到傀儡结点的后面
tmp.next = node2;
node1.next = node2.next;
node2.next = node1;
tmp = node1;
步骤七、返回新链表的头
return newHead.next;
图解:
3️⃣.全部代码
/**
* 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 newHead = new ListNode(-1);
ListNode tmp = newHead;
newHead.next = head;
//分别指向前两个结点
while(tmp.next != null && tmp.next.next != null){
ListNode node1 = tmp.next;
ListNode node2 = tmp.next.next;
tmp.next = node2;
node1.next = node2.next;
node2.next = node1;
tmp = node1;
}
return newHead.next;
}
}