單鏈表反轉問題

2021-09-05 19:40:45 字數 2200 閱讀 7519

今天聊乙個關於單鏈表反轉的問題,已知乙個單鏈表,給出頭結點,現要求定義乙個函式,輸入頭結點然後輸出反轉後的鍊錶。

#鍊錶反轉前

1->2->3->4->5->6->7->8->9

#鍊錶反轉後

1<-2<-3<-4<-5<-6<-7<-8<-9

首先我一看到這個問題,想到的是利用乙個陣列,將單鏈表按順序遍歷並把每個節點的值依次存放到陣列中,然後再將陣列倒序輸出即是反轉後的鍊錶。這種辦法其實也沒錯,但是不夠好,因為需要浪費額外的空間,且時間複雜度和空間複雜度均為 o(n)。

所以我們換一種思路來解決這個問題,能不能在遍歷鍊錶的同時就把節點的指標反向呢,這樣的話只需要遍歷一次鍊錶即可完成鍊錶反轉操作。這個思路看起來很不錯,但這裡有乙個重要的問題需要我們去解決,防止斷鏈,因為一旦把節點的指標反向了,當前指標就不再指向下乙個節點了,因此也就不能再繼續往後遍歷了,也就不能把這個完整的鍊錶進行反轉了,這種情況稱作斷鏈。

為了解決斷鏈的情況,我們就需要在節點指標反向之前,就把當前節點的下乙個節點先記下來,等到當前節點的指標完成反轉後,遍歷指標直接移動到剛剛被記住的那個節點,這樣就能防止斷鏈的情況了。

我們先定義三個指標,乙個指向當前節點 curr,乙個指向當前節點的前乙個節點 pre,乙個指向當前節點的後乙個節點 pnext。當遍歷到某個節點curr 時,把 pnext 指標指向 curr 的下乙個節點 curr->next,即記住了當前節點的下乙個節點,然後開始做指標反向操作,把 curr->next 反過來指向其前乙個節點 pre,這一步已經在原地完成了當前節點的反轉,接下來移動指標繼續完成和上面同樣的操作,即把 pre 移動到 curr,把 curr 移動到 pnext,直到所有的節點都被遍歷完。

要注意的是,鍊錶節點中的指標和自定義的三個指標是不一樣的,自定義的指標是用來記錄遍歷節點位置的,節點中的指標只代表指向其下乙個節點,這一點要注意區分,另外,在一般的高階語言中並沒有指標這一說法,比如在 python 中我們稱作引用,其實跟指標是一樣的,都表示指向所儲存物件的記憶體位址。

上面這種方法其實是在原地對指標進行反轉,我們其實還可以用遞迴的方式來實現反轉,使用遞迴來移動當前節點從而完成遍歷,但是依然需要在指標反向前先記住當前節點的下乙個節點。

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

#定義鍊錶節點,data為節點的value值,next為指向下乙個節點的指標

class node:

def __init__(self,data=none,next = none):

self.data = data

self.next = next

#定義反轉函式,引數為第乙個節點(頭結點)

def reverse(head):

#定義三個變數,分別表示當前節點、前節點(預設為none)、下乙個節點(預設為none)

curr = head

pre = none

pnext = none

#遍歷鍊錶,主要如果是空鍊錶不會進入遍歷,直接返回none

while curr:

pnext = curr.next

#開始反轉,把原本指向下乙個節點的指標指向前乙個節點

curr.next = pre

#為了繼續往後遍歷,需往後移動指標

pre = curr

curr = pnext

return pre

#遞迴實現反轉

def recursive(curr,pre=none):

if not curr:

return pre

pnext = curr.next

curr.next = pre

return recursive(pnext,curr)

if __name__ == '__main__':

link = node(1, node(2, node(3, node(4, node(5, node(6, node(7, node(8, node(9)))))))))

linkreverse = recursive(link)

# linkreverse = reverse(link)

while linkreverse:

print(linkreverse.data)

linkreverse =linkreverse.next

987

6543

21

單鏈表反轉問題

如何將單鏈表反轉?description definition for singly linked list.author crane yuan date 2016 9 17 下午12 11 13 public class listnode description 單鏈表反轉.param head ...

單鏈表操作 單鏈表反轉問題?

單鏈表 typedef struct nodelnode 關於但鍊錶的操作很多 增刪改查,逆序,子交並補等,以及一些經典的變式 考研題目中,有很多好的演算法值得學習。下面是c語言實現的,採用乙個method,乙個test method,方便逐個學習,這個需要不斷的積累,最好用敲幾遍,再在紙上多寫寫,...

單鏈表反轉

單鏈表反轉,可以用迴圈做,當然也可以遞迴 詳見 include includestruct node 3 1 4 6 2 1 1 3 4 6 2 2 4 1 3 6 2 3 6 4 1 3 2 4 2 6 4 1 3 5 迴圈反轉,即依次改動3個指標值,直到鍊錶反轉完成 比如,上面第 1 行到第 2...