@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...