0
点赞
收藏
分享

微信扫一扫

两两交换链表中的节点---2022/02/28

慕犹清 2022-02-28 阅读 39

文章目录

题目描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
题目来源

解题思考

两种方法:
第一种是定位法:
明确交换规律,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;

    }

性能评估

定位法性能评估:
在这里插入图片描述
递归法性能评估:
在这里插入图片描述
只能说差别不大,但总的来说先处理好尾巴再进行交换,以免出现覆盖陷入死循环的情况。

举报

相关推荐

0 条评论