给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[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; }
- }
*/
//这里的第一第二节点是初始顺序的第一个和第二个节点
public ListNode swapPairs(ListNode head) {
//设置虚拟节点
ListNode dummy = new ListNode(0);
dummy.next =head;
//设置移动节点
ListNode prev = dummy;
//每次判断是否还有连续两个数
while(head!=null && head.next!=null){
//保存第二个节点的下一节点
ListNode temp = head.next.next;
//让虚拟节点指向第二个节点
dummy.next = head.next;
//让第二个节点指向第一个节点
head.next.next = head;
//让第一个节点指向临时节点即第三个节点
head.next = temp;
//让虚拟节点移动到现在的第二个节点
dummy = head;
//让第一移动到第三节点
head = temp;
}
return prev.next;
}
}