先贴一下LeetCode的答案
方法一:迭代
假设存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3。
在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!
Java
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
复杂度分析
时间复杂度:O(n),假设 nn 是列表的长度,时间复杂度是 O(n)。
空间复杂度:O(1)。
方法二:递归
Java
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) return head;
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
复杂度分析
时间复杂度:O(n),假设 nn 是列表的长度,那么时间复杂度为 O(n)。
空间复杂度:O(n),由于使用递归,将会使用隐式栈空间。递归深度可能会达到 nn 层。
作者:LeetCode
链接:https://leetcode-cn.com/problems/two-sum/solution/fan-zhuan-lian-biao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
个人理解:
欢迎各位大牛指正!
迭代法:
Java
public ListNode reverseList(ListNode head) {
ListNode prev = null; //指定next为谁
ListNode curr = head; //当前节点
while (curr != null) { //当前节点不为空
ListNode nextTemp = curr.next; //将next储存在临时变量
curr.next = prev; //当前为头结点 next指向null
prev = curr; //将next改为当前节点 下一个节点的next就是当前节点
curr = nextTemp; //将当前节点改为下一个节点
}
return prev;
}
递归法:
例如:1->2->3
递归到2时 ReverseList(2.next)也就是ReverseList(3) 因为3.next=null 所以返回head为2
将3.next指向2 要将2.next=null 不然死循环 以此类推
参考1
public ListNode ReverseList(ListNode head)
{
if (head == null || head.next == null)
{
return head;
}
ListNode node = ReverseList(head.next);//递归改变处理顺序 54321 此时node=5 head=4
head.next.next = head;//5的下一个节点是4 为什么用head.next表示5? 因为node一直都是5,在head=3的时候 node也是5 用head.next表示下个节点
head.next = null;//4的下一个节点是null
return node;//返回5
}
作者:shadowrabbit
链接:https://leetcode-cn.com/problems/two-sum/solution/c-di-gui-by-shadowrabbit/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考2https://blog.youkuaiyun.com/xiaohuihui1994/article/details/90648734
class Solution:
def reverseList(self, head):
# 1-此函数的功能是对以head为头结点的链表进行反转,之后返回反转后的新链表的头结点
# 2-递归的出口是什么呢?对链表进行反转,显然head为空是一个出口,直接return,由于是对链表进行反转,所以当链表中只有一个元素的时候,即not head.next,也直接返回
if not head or not head.next:
return head
# 3-要对当前以head为头结点的链表进行反转,怎么通过递归解决当前这个问题呢
#递归关系式:reverseList(head) = (p=reverseList(head.next),再把p和head连接起来)
# 3-1.先缩小范围,对head.next为头结点的链表进行反转,此时返回的头结点为p
p = self.reverseList(head.next)
# 经过上述递归之后,现在链表为:
# head -> 1 <- 2 <- 3 <- 4 <- 5(p)
# 3-2.经过上述递归后,head.next为头结点的链表已经进行了反转,此时,再将头结点加入即可
# 注意:上述递归并没有对head结点进行操作,所以此时head的指向并没有改变!!!!这很重要
head.next.next = head
head.next = None
return p