24.两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
思路:链表题比较抽象,最好是画图解答。
该方法使用迭代来完成相邻节点的交换。首先创建一个头结点header用来确定链表的头部,将header同链表首元节点建立联系,随后新建一个指针p指向header(保留header位置,避免因后续操作丢失了头结点的位置,因此新建一个指向头结点的指针进行操作),就可以开始交换链表中相邻节点。
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null){
return head;
}
//创建头结点
ListNode header=new ListNode(0);
//头结点指向首元节点即链表第一个节点
header.next=head;
//新建一个指针指向header
ListNode p=header;
//若链表只剩一个节点或者不剩节点则停止交换
while(p.next!=null&&p.next.next!=null){
ListNode q=p.next;
ListNode k=p.next.next;
p.next=q.next;//<1>
q.next=k.next;//<2>
k.next=q;//<3>
//前两个节点交换完成,则将指针移到即将进行交换的两个节点前
p=q;
}
//返回链表第一个节点
return header.next;
}
}