Leetcode-反转链表

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

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