图解LeetCode——剑指 Offer 24. 反转链表

简介: 图解LeetCode——剑指 Offer 24. 反转链表

一、题目

  • 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

二、示例

示例:

【输入】 1->2->3->4->5->NULL

【输出】 5->4->3->2->1->NULL

限制:

  • 0 <= 节点个数 <= 5000

三、解题思路

  • 本题给出的数据结构是单向链表,那么链表中的每个节点ListNode只有2个变量,即:

int val】表示当前节点存储的值。

ListNode next】表示当前节点的后置节点的引用。

  • 那么既然是单向链表,我们遍历链表中所有结点的时候,就只能通过调用ListNode.next的方式逐一向后遍历节点,遍历方式当然不是问题的难点,难点是如何进行翻转呢?
  • 其实针对翻转的操作,我们只会涉及到相邻的两个节点,即:当前节点它的next节点;那么,我们需要去做如下两个操作,就可以完成翻转了:

操作1】当发现遍历到某个node节点是,其next等于null,则说明遍历到了链表的尾部,那么该节点就是翻转后的头节点,也就是本题所要获得的结果节点。

操作2】在递归遍历操作之后,执行head.next.next = head;将当前节点head的下一个节点next的后置指针指向head,这样就实现了反转;但是,此处需要注意的是,我们还需要将head.next设置为null,因为这个对于原链表的头节点很重要(因为它变为了新链表的尾节点,其next指针应该被设置为null)

  • 解题思路说完了,我们举例,尝试将Node(1)——>Node(2)——>Node(3)——>Node(4)——>Node(5)这个链表执行翻转操作。具体操作如下图所示:

四、代码实现

classSolution {
publicListNodereverseList(ListNodehead) {
if (head==null||head.next==null) returnhead; // 凤尾变龙头ListNoderesult=reverseList(head.next);
head.next.next=head; // 翻转链表head.next=null;
returnresult;
    }
}


今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
2月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
37 1
|
2月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
51 0
Leetcode第21题(合并两个有序链表)
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
22 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
2月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
53 0
|
2月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
91 0
|
2月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
22 0
|
2月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
2月前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
13 0
|
2月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
33 0