题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例1
输入:head = [1,2,3,4]
输出:[2,1,4,3]
思路
建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。
初始时,cur指向虚拟头结点,然后进行如下三步:
操作之后,链表如下:
看这个可能就更直观一些了:
代码
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode pre = new ListNode();
pre.next = head;
ListNode cur = pre;
while(cur.next != null && cur.next.next != null) {
ListNode temp1 = cur.next; //节点1
ListNode temp2 = cur.next.next; //节点2
ListNode temp3 = cur.next.next.next; //节点3
temp1.next = temp3;
temp2.next = temp1;
cur.next = temp2;
cur = cur.next.next;
}
return pre.next;
}
}
复杂度分析
时间复杂度:O(n),其中n是链表中节点的数目
空间复杂度:O(1)