單向鍊錶倒序的幾種方法略解

2021-05-28 02:41:52 字數 1889 閱讀 8107

想到的兩個方法,大致思想如下:

1. 用3個臨時指標:prevnode,currnode,nextnode

prevnode->currentnode->nextnode;

prevnode   currentnode->nextnode;

prevnode

prevnode         currentnode->nextnode;(prevnode=currentnode; currentnode=nextnode; nextnode=currentnode->next;)

prevnode

依次迴圈,終止條件:currentnode->next==null;

分析:該方法只需要一次遍歷即可,因此時間複雜度為:n;

建立了三個指標,空間複雜度為:3;

2. 用棧實現

把鍊錶從頭到尾依次壓入,然後依次壓出。要注意:指標的改變

分析:該方法遍歷一次,時間複雜度為:n;

需要棧存放所有指標,空間複雜度為:n;

綜合分析:兩種方法時間複雜度相同,但方法一所用空間複雜度為常數;而且方法二需要自己實現棧。

綜合比較方法一佔優。

3. 用倒插法實現

下面是自己的乙個實現。

基本思想:

因為對於倒插法來說,head是不變的,而把後面的節點倒過來。因此,設了乙個臨時的頭結點temphead,讓其next 指向真正的head,這樣就可以把所有的節點翻轉過來。

然後重新設定head為temphead->next,刪除temphead即可。

分析:該方法遍歷一次就可翻轉,因此時間複雜度為:n

需要用到三個臨時指標:temphead指向臨時頭節點;currentnode,nextnode;因此空間複雜度為常數。

問題(待解決):傳給函式乙個指標之後,函式會複製該實參指標(head),最後改變head時,實際改變的是複製的指標指向,而實際的head所指向的仍然沒有變化。

**實現:

翻轉前:四個節點的data分別為:1,2,3,4

翻轉後應該為:4,3,2,1

#include #include typedef struct _node

node, * pnode;

void print_node(pnode head)

printf("\n");

}void invert(pnode head)

//需要實際的改變head所指向的位址(而非內容),即給head重新指向

/*??&head=&(temphead->next);??*/

head=temphead->next;

printf("after invert in func:\n");

print_node(head);

}void main()

printf("before invert in main:\n");

print_node(head);

invert(head);

printf("after invert in main:\n");

print_node(head);

}

輸出結果:

before invert in main:

1 2 3 4

begin invert in func:

-842150451 1

-842150451 2 1

-842150451 3 2 1

-842150451 4 3 2 1

after invert in func:

4 3 2 1

after invert in main:

1補充: 這個方法是從csdn部落格上看到的,並做了完善。

大家如果有好的方法,還望不吝賜教!

鍊錶的倒序查詢

我所使用的方法在輸入的時候是使用乙個棧儲存所有的資料,利用的是其先進後出的資料結構。當然,用乙個陣列也是可以的 而且我覺得還可以儲存資料,而用stack的話操作比較麻煩。include include include include define len sizeof node using name...

1 單向鍊錶(建立,輸出,倒序輸出,轉置)

1.建立 通過頭尾指標建立乙個單向鍊錶 2.輸出 3.倒序輸出 遞迴 4.轉置 用三個指標,乙個被指向p1,乙個指向p2,乙個斷開p3 實現 include include typedef struct node list 建立 list createlist else 尾的下乙個等於temp 尾移...

Oracle刪除表的幾種方法

刪除表 記錄和結構 的語名delete truncate drop delete 刪除資料表裡記錄的語句 delete from表名 where 條件 注意 刪除記錄並不能釋放oracle裡被占用的資料塊表空間.它只把那些被刪除的資料塊標成unused.如果確實要刪除乙個大表裡的全部記錄,可以用 t...