首页 > 其他 > 详细

Leetcode-反转链表

时间:2020-03-03 10:52:20      阅读:70      评论:0      收藏:0      [点我收藏+]

206.反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

思路

技术分享图片

涂鸦中序号表示思考的顺序,实际执行还是126345

1. 创建一个节点pre指向Null
2. 创建节点cur指向head
3. 反转指向,将pre作为cur的下一节点,cur.next = pre
4. pre节点后移,pre = cur
5. cur节点后移(cur = cur.next)由于步骤3已经令cur.next=pre,所以需要提前缓存cur的下一节点,cur = temp
6. 提前缓存cur的下一节点,temp = cur.next

代码:

def reverseList(head:ListNode):
    pre = None
    cur = head
    while cur:
        temp = cur.next
        cur.next = pre
        pre = cur
        cur = temp
     return pre

打怪升级难度

92.反转链表 II

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

思考:

刚才完全反转链表,将\(pre\)指向了\(null\),现在可以把\(pre\)指向\(m-1\)节点,那\(n\)怎么处理呢?

恩~,如果遍历到\(n\)就停止,把剩下的接到新链表应该就可以了

技术分享图片

创建pre,cur指针 分别指向None和head,后移直到cur指向m位置

技术分享图片

反转子链表,直到pre走到n位置,拼起来

技术分享图片

1. 创建pre,cur指针 分别指向None和head
2. pre和cur一起后移,直到cur到m位置。可以看到在子链表反转后,cur会接到未反转部分,pre接到反转后子链表的头部。保存下cur和pre记录为tail和con
3. 反转子链表,直到pre走到n位置
4. 拼起来

coding

def reverseList2(head:ListNode,m,n):
    pre, cur = None,head
    index = 1
    while index < m:
        pre = cur
        cur = cur.next
        index += 1

    con,tail = pre,cur

    while index <= n:
        temp = cur.next
        cur.next = pre
        pre = cur
        cur = temp
        index += 1

    if con:
        con.next = pre
    else:
        head = pre
    tail.next = cur

    return head

Leetcode-反转链表

原文:https://www.cnblogs.com/gongyanzh/p/12400457.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!