题解 | #反转链表#

反转链表

https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

三指针法:

通过三个指针 ref1、ref2、ref3,分别指向 head、head.next及待赋值节点,

  1. 先给 ref3 = ref2.next;赋值把 ref2.next 保存起来,以保证节点的连续查询;
  2. 然后反转:ref2.next = ref1; 让 ref2的 next指向其前一个节点 ref1; 同时解决了节点的 next 需要制空的问题
  3. 移动指针:先把指针 2 赋值给指针 1,ref1 = ref2;然后将指针 3 赋值给指针 2,ref2 = ref3;
  4. 遍历完成后,head.next 还指向第 2 个节点呢,需要把它制空 head.next = null;
  5. 循环结束条件是 ref2 为空,其实是最后一个节点为空,因为移动指针后,ref1 被 ref2赋值,ref2被ref3 赋值。最后一轮赋值后,只有 ref1 不为空,将它赋值给 head = ref1;
  6. 返回 head , 完成反转
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode ReverseList (ListNode head) {
        // write code here
        if (head == null || head.next == null) {
            return head;
        }
        // 3 pointers
        ListNode ref1 = head;
        ListNode ref2 = head.next;
        ListNode ref3;
        while (ref2 != null) {
            // 保存ref2.next至ref3
            ref3 = ref2.next;

            // 反转,ref2指向前一个节点
            ref2.next = ref1;

            // 向前移动指针
            ref1 = ref2;
            ref2 = ref3;

        }
        // 结束后将头节点的引用置空,并将ref1给头节点
        head.next = null;
        head = ref1;
        return head;
    }
}

全部评论

相关推荐

家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务