小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
leetcode206-反转链表
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2:
输入:head = [1,2] 输出:[2,1] 示例 3:
输入:head = [] 输出:[]
解题思路分析
解法1
本方案主要是采用前后节点置换的思路。在递归操作中末尾节点,从末尾节点向前进行递归操作。按照递归的思路进行处理。每次都需要找到下一节点。将下一节点的下一节点设置为当前节点,同时将下一节点的当前下一节点作为上一节点替换。以此思路进行操作,直至最后一个节点返回,作为头节点即可。 代码如下:
public ListNode reverseList(ListNode head) {
if(head == null){
return null;
}
// 结束节点
if(head.next == null){
return head;
}else{
ListNode node = reverseList(head.next);
ListNode last = getNextNode(head);
head.next = null;
last.next = head;
return node;
}
}
public ListNode getNextNode(ListNode node){
if(node.next != null){
return getNextNode(node.next);
}else{
return node;
}
}
复制代码
解法2
本方法属于对递归方法的一种优化,简化递归过程中的处理步骤,降低代码量。思路同样是两个节点之间的关联替换处理。 代码如下:
public ListNode reverseList(ListNode head) {
if(head == null){
return null;
}
// 结束节点
if(head.next == null){
return head;
}else{
ListNode node = reverseList(head.next);
head.next.next = head;
head.next = null;
return node;
}
}
复制代码
复杂度分析
- 时间复杂度 o(n)
- 空间复杂度 o(1)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。