【LeetCode】24. 两两交换链表中的节点

  今日学习的文章链接和视频链接

leetcode题目地址:24. 两两交换链表中的节点

 代码随想录题解地址:代码随想录

题目简介

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

看到题目的第一想法(可以贴代码)

1. 取当前node①,node.next②和node.next.next③三个节点,

        令②.next = ①

        ①.next = ③

        一直循环,其退出条件是,①.next = null

2. 设一个空头nullHead,用于①统一操作,②记录return值,③交换节点时需要记录前一个节点(以保证链表的连续),需要用它处理头节点部分的交换,其实也是统一操作的一部分。

nullHead -> ① -> ② ->③ ->④ ->⑤

temp指针指向①,new一个新的空节点存储②的值(以保证链表的连续,此处用实值),用一个新节点存储节点③(以保证链表的连续,此处用指针),用一个新节点存储节点nullHead记为pre。

        ①.next = ③

        ②.next = ①

        pre.next = ②

得到结果:nullHead -> ② -> ① ->③ ->④ ->⑤

一轮换位结束,调整temp指针与pre指针:

        pre = temp(pre = ①)

        temp = ③

重复上述操作即可。

public ListNode swapPairs(ListNode head) {
        ListNode temp = head;
        ListNode nullHead = new ListNode(0);
        nullHead.next = head;
        ListNode pre = nullHead;
        while (temp != null && temp.next != null) {     // 此处报错,因为head即temp可能为空,因此null.next不成立,报错。
            ListNode ex = new ListNode(temp.next.val);
            ListNode nextTemp = temp.next.next;
            temp.next = nextTemp;
            ex.next = temp;
            pre.next = ex;
            //print(nullHead);
            //System.out.println("temp   :"+temp.val);
            //System.out.println("pre    :"+pre.val);
            pre = temp;
            temp = nextTemp;
            //print(nullHead);
        }
        return nullHead.next;
    }
    public void print(ListNode nullHead){
        ListNode pre1 = nullHead.next;
        while (pre1!=null){
            System.out.println("node: "+pre1.val);
            pre1 = pre1.next;
        }
        System.out.println("------------------ ");
    }

实现过程中遇到哪些困难

看完代码随想录之后的想法

【解题思路】顺清逻辑就行了。

从pre开始,无需new创建实值的节点,逻辑也更清晰一些(刚改了一下,发现我的②node,也不需要是实值node,那其实逻辑几乎是一模一样的,只是交换的顺序不太一样)。

定义:

        pre = nullHead

        ① = temp

        ② = temp.next

        ③ = temp.next.next

交换操作:

        pre.next = ② 

        ②.next = ①

        ①.next = ③

重新定位:

        pre = ①

        temp = ③

【想法】

1. 虚拟头节点思想和我一致。

2. while退出条件:temp != null && temp.next != null 即 只剩一个单独元素就不进行交换操作。

看完视频自己写的ACC:

public ListNode swapPairs(ListNode head) {
        ListNode temp = head;
        ListNode nullHead = new ListNode(0);
        nullHead.next = head;
        ListNode pre = nullHead;
        while (temp != null && temp.next != null) {
            ListNode ex = temp.next;
            ListNode nextTemp = temp.next.next;

            pre.next = ex;
            ex.next = temp;
            temp.next = nextTemp;

            pre = temp;
            temp = nextTemp;
        }
        return nullHead.next;
    }

学习时长


今日收获

1. 一个function里不能包含其他function

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值