鍊錶逆置 三種方法詳解

2021-09-13 12:18:39 字數 1835 閱讀 2625

@achievek

本題要求實現乙個函式,將給定的單鏈表逆轉。

##函式介面定義:

list reverse( list l );

其中list結構定義如下:

typedef struct node ptrtonode;

struct node ;

typedef ptrtonode list; / 定義單鏈表型別 */

l是給定單鏈表,函式reverse要返回被逆轉後的鍊錶。

#include

#include

typedef int elementtype;

typedef struct node *ptrtonode;

struct node ;

typedef ptrtonode list;

list read(); /* 細節在此不表 /

void print( list l ); / 細節在此不表 */

list reverse( list l );

int main()

/* 你的**將被嵌在這裡 */

輸入樣例:

51 3 4 5 2

輸出樣例:

12 5 4 3 1

居中的:

##**入下

思路在注釋中 這種方法是最常用的方法 時間複雜度o(n) 空間複雜度

總體分為迴圈核心操作與迴圈連線操作.

具體來說就是新建乙個結構體指標prev,讓其初始時指向null,然後讓鍊錶l的第乙個元素指向prev(null),這樣做形象地說就是將第乙個元素從原始鍊錶l剪下,並粘在了prev的前面,形成了新的鍊錶list2;下一次迴圈的核心操作也是如此,即將第二個元素從被剪後的原始鍊錶中(我們記作list』,l的第二個元素也就是list』的第乙個元素)剪下,粘到list2上;但需要注意此時l的指向已經發生改變,故不能直接進行下一次迴圈操作,還需要一些迴圈連線操作,使迴圈得以進行.

那迴圈連線操作應該怎樣做呢?

我們需要乙個引入臨時指標,在每次迴圈中指向著list』(第一次迴圈就是l)的第二個元素.這樣,我們就可以保證每一次迴圈之後,我們都能找到list』的第乙個元素,這是為了我們下一次的"剪"做鋪墊.

那貼呢?由於我們並沒有移動prev,它還指著null呢,於是我們就必須讓prev也同時往前指,每次迴圈中都指向剛剛粘過來的元素.,

最後我們只要讓l再指向剛剛臨時指標temp指向的位置,就能保證下一次能直接把l所指元素直接剪下來拉.這樣迴圈連線操作就完成拉》_

****如下:

//  

list reverse

( list l

)return prev;

}

具體來說就是,新建乙個節點,然後讓該節點的值等於鍊錶第乙個元素的值;再通過遍歷原時鍊錶,每次得到下一節點的值,再利用頭插法插入到新鍊錶的前面.這種思路有暴力解決內味兒了,時間複雜度o(n),空間複雜度o(n)

list reverse

(list l

)return t;

}

## 第三種方法:遞迴

遞迴的核心思想是將原問題化為更小規模的子問題;

所以我們先從簡單情況入手

假設原鍊錶只有乙個結點p1,我們只需返回p1結點即可

假設原煉表有兩個...

生病了 回頭補思路

總結 逆置雙向鍊錶的三種方法

雙向鍊錶的遍歷要比單向鍊錶方便很多,所以逆置方法要比單鏈表豐富很多,因為可以從後向前遍歷,所以可以像逆置陣列一樣進行操作,也可以根據單鏈表的特性進行逆置,也可以用雙鏈表獨有的特性進行逆置。具體方法如下 鍊錶的類定義如下 typedef int datatype class dsnode privat...

python程式設計練習 三種方法實現鍊錶的逆序

鍊錶的儲存特點 可以用任意一組儲存單元來儲存單鏈表中的資料元素,而且除了儲存每個資料元素外,還必須儲存 指示其直接後繼元素的資訊 實現鍊錶的逆序 方法1 就地逆序 在遍歷鍊錶的時候,修改當前結點指標域的指向,讓其指向它的前驅結點。需要用乙個指標變數來儲存前驅結點的位址,此外為了在調整當前結點指標域的...

鍊錶建立的三種方法

作為最常用的資料結構之一,鍊錶被廣泛應用在各個方面,下至作業系統底層的驅動程式上至各種應用軟體,都處處可以看到鍊錶的身影,皆因其操作的簡便與應用的高效性。總結個人目前所學,鍊錶的建立方式主要有 以下幾種方法 方法一 struct link node struct link node list nul...