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