题解 | #反转链表#

反转链表

http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

方法一:构造链表(我采用的方法,不是最优解)

解题思路

1. 循环,让指针p指向链表的尾节点,同时用字典存储每个链表的前驱节点,用于重构链表
2. 根据字典重新构建反向的链表

代码:

    def ReverseList(self , head: ListNode) -> ListNode:
        # write code here
        # 特例处理
        if not head: return None
        # 让指针指向尾节点,并存储每个节点的后继节点
        dic = {}
        dic[head] = None
        p = head
        while p.next:
            dic[p.next] = p
            p = p.next
        print(dic)
        revhead = p # 反转后的头节点
        while p:
            p.next = dic[p]
            p = dic[p]
        return revhead
  • 时间复杂度O(n + n),需要遍历两次链表
  • 空间复杂度O(n),需要一个字典存储链表

方法二:三指针法

当要求空间复杂度为1时采用这种方法

解题思路:

1. 初始化三个指针,
	- pre指针指向已经反转好的链表的最后一个节点,最开始没有反转指向null
	- cur指针指向待反转链表的第一个指针,最开始第一个节点待反转,指向head
	- nex指向待反转链表的第二个节点,目的是保存链表,当cur改变指向后,后面的链表就都失效了,所以需要保存
2. 循环执行
	- nex=cur.next
	- cur.next = pre
	- pre = cur
	- cur = nex

代码:

    def ReverseList(self, head: ListNode) -> ListNode:
        # write code here
        if not head: return None

        pre, cur, nex = None, head, head.next

        while cur:
            nex = cur.next
            cur.next = pre
            pre = cur
            cur = nex
        return pre
  • 时间复杂度O(n),只需要遍历链表一次
  • 空间复杂度O(1),无需额外的存储空间
全部评论

相关推荐

不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务