文章目录
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
题目来源
解题思考
两种方法:
第一种是定位法:
明确交换规律,1与2交换(1称为交换位1,2称为交换位2),3与4交换(3称为交换位1,4称为交换位2),以此类推。所以要做定位,就是定位到奇数位,此时的奇数位与其后一位进行交换。为保证交换顺利,需要两个指针同时指向根节点,根节点的下一节点是head。
第二种是递归法:核心方法是先取出head的next,定位为result,以及不涉及到当前交换的head的next的next,而后更新head后的next为做好交换的head的next的next(需要用到递归的地方),并将head放到result的next,并做返回。
代码实现
定位法实现:
public ListNode swapPairs(ListNode head) {
if(head==null||head.next==null) return head;
ListNode root=new ListNode(0);
root.next=head;
ListNode p=root;
while(head!=null&&head.next!=null) {
ListNode temp=head.next.next;
p.next=head.next;
p.next.next=head;
//这里会导致出现环的情况,这是因为p的下一个是head的下一个,
//p的下下一个(head的下一个)又是head,从而进入循环,
//以下是结束循环的关键。
p.next.next.next=temp;
head=temp;
p=p.next.next;
}
return root.next;
}
递归法实现:
public ListNode swapPairs(ListNode head) {
if(head==null||head.next==null) return head;
ListNode res=head.next;
ListNode temp=res.next;
head.next=swapPairs(temp);
res.next=head;
return res;
}
性能评估
定位法性能评估:
递归法性能评估:
只能说差别不大,但总的来说先处理好尾巴再进行交换,以免出现覆盖陷入死循环的情况。