想要精通算法和SQL的成长之路 - 反转链表
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
想要精通算法和SQL的成长之路 - 反转链表
前言
一. 反转链表
原题链接
给你单链表的头节点 head 请你反转链表并返回反转后的链表。
思路如下 我们可以通过一次遍历修改链表节点的指针指向。由于指针修改的时候指针的引用就变了。我们需要用一个临时变量tmp
来保存节点。同时我们需要一个变量pre
来标识上一个节点。以及cur
代表当前节点。
那么我们以上图为例原本的指针是 1 --> 2
。我们要做的就是断开这个链接。然后将指针改为 2 --> 1
。别看这个操作看似简单但是真正的实现需要分为如下几个步骤
- 首先
pre
的值为null
cur
的值就是链表头结点1。我们要提前存储2这个节点的引用后续指针改变了就拿不到了也就是tmp = cur.next;
- 然后将当前指针的
next
改为上一个节点。即反转的实现cur.next=pre;
这里其实就是相邻节点的一个指针反转了。但是我们既然要整个链表都反转我们就难以避免递归。因此我们还需要将cur
和pre
的指针往后移动。不断地循环上述操作。即
pre
指针后移一位pre = cur;
cur
指针后移一位cur = tmp
tmp
是最开始存储的cur.next
引用如图
循环终止条件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;
}
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |