题解 | #反转链表#

反转链表

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-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务