小夕的公众号发文方式
- 由于公众号的改版,如果不经常发文的话,小夕的读者朋友们会收不到小夕的写的文字,因此天天发文就很必要
- 但小夕的一篇漫画算法原创文章,大概需要5-10个小时的耗时,动画+漫画的那些图片制作起来非常费时间!
- 所以为了既天天发文,又能保持高质量的漫画算法原创文章的更新,现绝对用如下的发文方式
之前的原创动漫漫画算法文
戳一下即可进行跳转哦~
动漫算法:字节面试题太坑了,刚回答完,就被面试官diss了!
动漫算法:作业帮面试题:求一个数的二进制中1的个数
动漫算法:百度面试题:用两个栈实习一个队列
动漫算法:如何在二维数组中找到一个数?
动漫算法:美团面试题:根据前序序列和中序序列重建二叉树!
动漫算法:美团面试题,将链表逆序存放到数组中
动漫算法:腾讯面试题,请实现把字符串中的空格替换为“%20”
发文方式
- 小夕会天天更新文章,文章以小夕的每日在算法刷题群公布的题目的题解为主,另外每天小夕会在文章中聊一下在大厂百度(嗯~是的
小夕在百度工作
)的遇到的问题和一些工作经验(注意这些文章以每天刷题为主,所以这些文章第二天就会删除,所以请紧随小夕的步伐刷题,后续看情况再议,目前是决定当天发文,第二天删文) - 小夕的漫画算法原创文章会保持一周1-2篇的更新
- 这样小夕既能天天发文保持天天更新,又能保证高质量的算法原创文章了~
题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
题解
题解动画
小夕来和大家分析一下这个动画,看完动画我们发现一个事情:用一个pre节点指向前一个节点,用cur节点指向当前节点,然后我们让cur的next节点指向pre就完成了反转。
小夕暂停10s,大家细细品一下~你品,你细品~
嗯,接下来问题来了,我们把这幅动画暂停一下截一张图出来~~~小夕打一个大大的问号,嘿嘿~~
聪明的读者朋友们,有没有发现这里断开了呀~~~ 断开了那么它是接下来如何找到下一个节点2的呢?
为了找到下一个节点,**必须新建一个节点tmp把下一个节点(也就是2节点)保存起来,这样当断开以后才可以找到下一个节点~~~ **
妙不妙~~~
图解描述
参考https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/solution/dong-hua-yan-shi-duo-chong-jie-fa-206-fan-zhuan-li/
初始状态下图中cur执行head头节点,pre是cur的左边的前一个节点,所有pre是null进入循环由于存在之前说的断开的情况,小夕这里采取tmp节点提前保存好下一个节点。也就是tmp = cur.next
接下来就是cur指向pre节点了,这样就成功反转了第一个1号节点了。为了继续进行反转,pre节点往前移动到cur节点,也就是pre = cur
那么由于pre节点往前移动了,小夕聪明的读者朋友们肯定就会知道接下来是要干什么了。cur也往前移动到下一个节点。如果移动呢?由于断开以后小夕提前保存好了下一个节点,所以让cur=tmp
这样cur节点就指向下一个节点了。循环还未结束。继续重复上面的操作。一样的道理,tmp继续提前保存好cur的下一个节点。cur.next指向pre节点,完成2号节点的反转。pre往前移动,同上cur指向提前保存好的tmp节点,开始准备反转3号节点。循环还未结束,继续往下。tmp继续指向下一个节点,也就是null节点了。cur.next指向pre节点,完成3号节点的反转。pre继续往前移动 (这里注意pre的位置,小夕的聪明读者肯定发现了pre指向反转后的头结点!!!)cur也继续往前移动。cur节点为null,循环结束。
看到这里,小夕的读者应该明白了吧,当然如果小夕没说明白,可以加小夕的微信(teihanhan12341) 不懂的问小夕啦~~~ 接下来上代码~~~ gogogo
代码
Java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//申请节点,pre和 cur,pre指向null
ListNode pre = null;
ListNode cur = head;
while(cur!=null) {
//记录当前节点的下一个节点 这里用next保留一下 也就是tmp
ListNode next = cur.next;
//然后将当前节点指向pre
cur.next = pre;
//pre和cur节点都前进一位
pre = cur;
cur = next;
}
return pre;
}
}
Python
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
# 申请两个节点,pre和 cur,pre指向None
pre = None
cur = head
nxet = None
while cur:
# 记录当前节点的下一个节点
nxet = cur.next
# 然后将当前节点指向pre
cur.next = pre
# pre往前移动一位到cur节点位置
pre = cur
# 所以cur也要往前移动一位到next节点位置
cur = nxet
return pre
c++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = NULL;
ListNode* pre = head;
while (pre != NULL) {
// 记录当前节点的下一个节点
ListNode* next = pre->next;
// 然后将当前节点指向pre 反转
pre->next = cur;
// pre往前移动一位到cur节点位置
cur = pre;
// # 所以cur也要往前移动一位到next节点位置
pre = next;
}
return cur;
}
};
JS
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
var pre = null;
var cur = head;
var next = null;
while(cur){
next = cur.next;//修改前先记住下一个节点
cur.next = pre; //改别指向,第一个节点prev是null,
pre = cur; // 记录前一个节点,供下次循环使用
cur = next; // cur通过next指向下一节点
}
return pre;
};
php
/**
* Definition for a singly-linked list.
* class ListNode {
* public $val = 0;
* public $next = null;
* function __construct($val) { $this->val = $val; }
* }
*/
class Solution {
/**
* @param ListNode $head
* @return ListNode
*/
function reverseList($head) {
$cur = $head;
$pre = null;
while($cur){
$next = $cur->next;
$cur->next = $pre;
$pre = $cur;
$cur = $next;
}
return $pre;
}
}
Go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
if head == nil {
return nil
}
var pre *ListNode
cur := head
for cur != nil {
next := cur.Next
cur.Next = pre
pre = cur
cur = next
}
return pre
}
睡觉睡觉
小夕终于写完了!!!冲冲冲!准备睡觉啦!开心!!!文章觉得不错的记得在看转发一下呀朋友们!!!凌晨1点,今天比昨天早了点开心!小夕的读者朋友不盼我点好~~~委屈,好的知道大家开玩笑的啦哈哈哈哈哈哈
小夕最后有话说
- 动画、漫画、加6种编程语言(Java、C++、PHP、GO、Python、JS)的讲解很费心血,希望大家能帮忙转发到朋友圈和身边的朋友,这样小夕的文章能让更多的人看见的话,小夕会更有动力更新文章的呀~。
- 公众号后台回复 打卡 查看公众号福利 坚持转发文章到朋友圈,小夕送上100元的红包给你,谢谢铁杆粉丝的支持。
- 加小夕微信 tiehanhan12342 拉你进算法刷题群。