劍指offer 反轉鍊錶(python和c )

2021-10-04 13:48:37 字數 3442 閱讀 8612

題目描述

輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。

python

#第一種方法:

""" phead始終指向要反轉的結點

last 指向反轉後的首結點

每反轉乙個結點,

把phead結點的下乙個結點指向last,

last指向phead成為反轉後首結點,

再把phead向前移動乙個結點直至none結束

"""# -*- coding:utf-8 -*-

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:# 返回listnode

defreverselist

(self, phead)

:#首先判斷這個煉表裡是否只有乙個結點,只有乙個結點那麼它就不需要發生變化,它第乙個結點指向的指標就為 none

# 這個時候就直接返回這個 phead

ifnot phead or

not phead.

next

:return phead

#首先要明白 反轉過後,第乙個數值的指標的結點指向的是none 也就是乙個指向反轉後的首結點 為none

last =

none

#當 要反轉的結點 phead 存在的時候

while phead:

#先找到第乙個元素的結點指向的元素,賦值給乙個臨時變數

temp = phead.

next

""" 本來乙個元素的結點 是要指向它的下乙個 元素的 .

反轉後 就是 這個元素 要指向它的 上乙個 元素 .

"""#然後第一次迴圈 把這第乙個元素的結點 改為 none last 第乙個值 是 none (此時還沒有發生改變的last)

# 之後迴圈 就是 每 反轉乙個結點 把phead結點的下乙個結點指向last,

phead.

next

= last

#下一步 是把 phead 這個 元素的 賦值給last

# last指向phead成為反轉後首結點,

last = phead

# 再把phead向前移動乙個結點直至none結束

phead = temp

return last

"""反轉需要兩步 ,第一步找到它的 結點,第二步改變結點就可以了;

之後需要 把結點 賦值為 這個元素的 本身 ;

迴圈: 找到 元素結點指向的元素,

目標是 讓元素結點指向的元素 改為 自己本身。

"""#第二種方法:

"""1 將現有的頭換成尾,尾部的next為空

2 將從第二個node開始,迴圈將next指向前乙個

3 需要一直有乙個指標指向還沒有反轉的鍊錶的頭部

"""class

solution2

:# 返回listnode

defreverselist

(self, phead)

:#判斷是否為空值,沒有元素

if phead ==

none

:return

none

#判斷是否只有乙個元素

if phead.

next

==none

:return phead

#左邊指標為 頭 第乙個 指標

leftpointer = phead

#中間 的指標 為 第二個指標

midpointer = phead.

next

#右邊的指標 為 指向 中間 指標後的 所有的元素

rightpointer = midpointer.

next

#左邊的指標為 起始 的 元素, 反轉後 它的next 為 none;

leftpointer.

next

=none

#迴圈,當我的右邊的結點指向的 元素 一直存在的時候,那麼就會一直迴圈,一直來反轉結點。

while rightpointer:

#中間指標指向的為上乙個 元素 即 leftpointer

midpointer.

next

= leftpointer

#三個指標開始往右移。每次移乙個。

#左邊指標 往右移乙個 就是中間指標的位置

leftpointer = midpointer

#中間指標 往 右 移 乙個,就時 右邊指標的位置

midpointer = rightpointer

#右邊指標往右移 乙個 ,就時 右邊指標的下乙個。

rightpointer = rightpointer.

next

#當右指標 指向的為 空的時候 就會跳出迴圈,那麼此時的最後一次迴圈的 中間的指標的 指向的 是此時的左 指標。

midpointer.

next

= leftpointer

#最後返回中間的 這個指標,就是 最後乙個 反轉的指標的第乙個,表頭。

return midpointer

c++

/*

struct listnode

};*/

class

solution

listnode* head = p;

while

(!s.

empty()

) p -

> next =

null

;return head;

/*

if(phead == null || phead -> next == null)

return phead;

listnode* p = phead;

listnode* q = phead -> next;

listnode* r = null;

phead -> next = null;

while(q)

return p;

/*if(phead == null || phead -> next == null)

listnode* p = phead -> next;

listnode* q = null;

while(p -> next)

p -> next = phead;

phead = p -> next -> next;

p -> next -> next = null;

return phead;

*/}}

;

劍指offer 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。方法1 將單鏈表儲存為陣列,然後按照陣列的索引逆序進行反轉。方法2 使用三個指標遍歷單鏈表,逐個鏈結點進行反轉。方法3 從第2個節點到第n個節點,依次逐節點插入到第1個節點 head節點 之後,最後將第乙個節點挪到新錶的表尾。public class l...

劍指offer 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。1.非遞迴 struct listnode class solution listnode ppre null listnode p phead listnode pnext null while p null else p pnext return p...

《劍指offer》 反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。之前錯誤的寫法,一直不明白 原因是移位的時候,pcurr移到下一位時,裡面的值已經變成反向指標了,所以不能成功移動,就迴圈巢狀進去了,所以還需要乙個變數pnext來儲存移位前的值。struct listnode class solution phead ...