思路(三指針法)
拿到一個題,首先得明白給定得條件和目的。
- 條件:一個鏈表,一般指單鏈表
- 目的:反轉該鏈表、
再考慮特殊情況。
- 給定得鏈表爲空時,怎麼辦(直接返回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)