單鏈表反轉遞迴與非遞迴演算法

2021-09-27 12:51:07 字數 1307 閱讀 9108

1. **如下:

1 #include 2 #include 3

4using

namespace

std;56

struct

node 715

};16

17 node* createlist(int *elem, int

length)

1825

return

p;26}27

28void destroylist(node* &p)

2934 node* tmp=p;

35while

(p)3641}

4243

void print(node*p)

4449

while

(p)50

54 cout<

56void iterativereverse(node* &p)

5762 node* pre=null;

63 node* curr=p;

64while

(curr)

6571 p=pre;72}

7374

void recursivereverse(node* &p)

7580 node* rest=p->m_next;

81if (!rest)

8285

recursivereverse(rest);

86 p->m_next->m_next=p;

87 p->m_next=null;

88 p=rest;89}

9091

intmain()92;

94int elem[length]=;

95 node* plist=createlist(elem,length);

96print(plist);

97//

iterativereverse(plist);

98recursivereverse(plist);

99print(plist);

100destroylist(plist);

101return0;

102 }

2. 在非遞迴演算法(迭代演算法)中,需要注意的是邊界條件檢查問題,這裡巧妙地只檢查curr是否為空,初始情況下將pre設定為null,在curr不為空的情況下定義next指標,之後迭代逐次向後修改鍊錶中的指標。

3. 在遞迴演算法中,最後一句p=rest保證rest一直指向反轉鍊錶的頭部,不會改變,還沒理解這個究竟是怎樣做到的。

單鏈表反轉(遞迴和非遞迴)

單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 cpp view plain copy typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟...

單鏈表反轉(遞迴和非遞迴)

單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟2 其中注意,鍊錶是以節點後繼為null...

面試題 單鏈表反轉 遞迴和非遞迴

include include typedef struct node node,linklist 一般反轉 linklist reverse linklist head node pre,cur,next pre head cur head next while cur head next nul...