题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
输入:head = []
输出:[]
代码实现:
public class LC24 {
}
/**
* 使用虚拟头结点法
* 0->1->2->3
* 第一步:0->2->3
* 第二步:0->2->1
* 第一步:0->2->1->3
*/
class Solution3 {
public ListNode swapPairs(ListNode head) {
//定义一个虚拟头结点
ListNode virtualHead = new ListNode(0, head);
//定义当前节点
ListNode current = virtualHead;
//存储当前节点指向
ListNode temp1 = null;
ListNode temp2 = null;
//保证至少有两个真实节点存在才进行反转
while (current.next != null && current.next.next != null) {
// 0->1->2->3
temp1 = current.next;//0->1
temp2 = current.next.next.next;//2->3
//翻转开始
//0->2->2->3
current.next = current.next.next;
//0->2->1
current.next.next = temp1;
//0->2->1->3
current.next.next.next = temp2;
//更新当前指针位置
current = current.next.next;
}
//真实头结点是虚拟节点的一个节点
return virtualHead.next;
}
}