想要精通算法和SQL的成长之路 - 反转链表

想要精通算法和SQL的成长之路 - 反转链表

  • 前言
  • 一. 反转链表

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 反转链表

原题链接
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
想要精通算法和SQL的成长之路 - 反转链表_第1张图片

思路如下: 我们可以通过一次遍历,修改链表节点的指针指向。由于指针修改的时候,指针的引用就变了。我们需要用一个临时变量tmp来保存节点。同时我们需要一个变量pre来标识上一个节点。以及cur代表当前节点。
想要精通算法和SQL的成长之路 - 反转链表_第2张图片

那么我们以上图为例,原本的指针是 1 --> 2。我们要做的就是断开这个链接。然后将指针改为 2 --> 1。别看这个操作看似简单,但是真正的实现需要分为如下几个步骤:

  1. 首先,pre的值为nullcur的值就是链表头结点1。我们要提前存储2这个节点的引用(后续指针改变了,就拿不到了),也就是 tmp = cur.next;
  2. 然后,将当前指针的next,改为上一个节点。即反转的实现:cur.next=pre;

这里其实就是相邻节点的一个指针反转了。但是我们既然要整个链表都反转,我们就难以避免递归。因此我们还需要将curpre的指针往后移动。不断地循环上述操作。即:

  1. pre指针后移一位:pre = cur;
  2. cur指针后移一位:cur = tmptmp是最开始存储的cur.next引用)如图:
    想要精通算法和SQL的成长之路 - 反转链表_第3张图片

循环终止条件:cur当前指针不为null。最终完整代码如下:

public ListNode reverseList(ListNode head) {
    ListNode cur = head, pre = null, tmp = null;
    while (cur != null) {
        // 1.临时存储下一个节点的引用
        tmp = cur.next;
        // 2.指针反转的核心步骤
        cur.next = pre;
        // 3.pre(上一个指针)往后移
        pre = cur;
        // 4.cur指针同样往后移,进入下一次循环进行指针反转
        cur = tmp;
    }
    return pre;
}

你可能感兴趣的:(链表,算法,sql)