文章目录
题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
解法1:设置前驱节点
/**
* 思路:
* 设置前驱节点pre,保证前驱节点一直指向交换后的位置
* 确定3个节点,当前节点curr,next节点,next.next节点nn
* 让next指向curr,curr指向nn。同时最关键的让pre指向next
* 重新确定pre和curr节点
* 只要curr!=null&&curr.next!=null就进行循环
* 最后返回我们一开始创建的指向头节点的dumm.next
*/
public static ListNode swapPairs(ListNode head) {
ListNode pre = new ListNode(-1);
ListNode dummy = pre;
pre.next=head;
ListNode curr = head;
while (curr!=null&&curr.next!=null){
ListNode next = curr.next;
ListNode nn = next.next;
next.next=curr;
curr.next=nn;
pre.next=next;
pre=curr;
curr=nn;
}
return dummy.next;
}
时间复杂度:On
空间复杂度:O1
解法2:递归
/**
* 思路:
* 递归传入一次走2个节点
* 如果head==null||head.next==null就返回head
* 递归到尾节点的那组,交换两个节点的指向
* 返回在前面的那个节点
*/
public ListNode swapPairs(ListNode head) {
if (head==null||head.next==null){
return head;
}
ListNode tail = swapPairs(head.next.next);
ListNode return_node = head.next;
head.next.next=head;
head.next=tail;
return return_node;
}
时间复杂度:On
空间复杂度:On