劍指offer15:反轉鏈表

在這裏插入圖片描述

思路(三指針法)

拿到一個題,首先得明白給定得條件和目的。

  • 條件:一個鏈表,一般指單鏈表
  • 目的:反轉該鏈表、

再考慮特殊情況。

  • 給定得鏈表爲空時,怎麼辦(直接返回None)
  • 對於該題目,還需要考慮當鏈表長度爲1時得情況(返回pHead)

再考慮一般得思路。

  • 要反轉鏈表,最直接得想法就是頭插法。我們可以新建立一個鏈表,用來存儲要返回的頭節點,但是題目中隱含要求頭節點不能爲空,所以不能新建鏈表,只能再原有的基礎上進行操作。
  • 不新建鏈表我們就需要三個指針
    p:指向原鏈表的第一個結點,也是新鏈表的尾結點,所以要在開始時置p.next=None
    q: q = p.next,用來執行頭插的操作
    r:用來追蹤原始鏈表
    三個指針每次循環時都向前移動,直到r.next = None,此時,需要再執行q.next = p的操作,最後一個結點加入新鏈表成爲新鏈表的第一個結點。
# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        
        if pHead == None:
            return None
        if pHead.next == None:
            return pHead
        
        p = pHead
        q = pHead.next
        r = pHead.next.next
        p.next = None
        while r:
            q.next = p
            p = q
            q = r
            r = r.next
        q.next = p
        return q           

時間複雜度

頭插操作是O(1),遍歷操作是O(n),所以時間複雜度爲O(n)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章