本文**:http://chaishushan.blog.163.com/blog/static/130192897200911725838630/
假設鍊錶的結構為:
struct node ;
單向鍊錶是乙個有序的序列.假設有乙個單向鍊錶a:
1, 2, 3, 4, 5, ...
現在將a表逆序後得到鍊錶b:
..., 5, 4, 3, 2, 1
// 常規的反轉鍊錶方法
node *reverse(node *list)
return r;
}其實上面的這個操作自然地對應於棧的出棧/壓棧操作.
因此, 單向鍊錶的逆序問題我們也可以抽象為a和b兩個
棧的轉換問題.
現在給node實現用於棧的操作函式:
// 1. 判斷棧是否為空
bool isempty(node* stack)
// 2. 向棧stack中壓入乙個node元素
void push(node* &stack, node* node)
// 3. 從棧stack中彈出乙個元素
node* pop(node* &stack)
下面可以基於棧實現單向鍊錶的逆序操作了.
node *reverse(node *oldlist)
return newlist;
}採用棧的思維來思考單向鍊錶的逆序問題之後,許多本來
相對複雜的問題都會變得異常簡單. 例如, 我們現在再
考慮用遞迴的方法來逆序鍊錶.
// 遞迴實現反轉鍊錶
node *reverse(node *oldlist, node *newlist=null)
// 遞迴版本的呼叫方式
int main()
另一種遞迴方法:
node* reverse( node* pnode, node*& head)
node* temp = reserve(pnode->next, head);// 遞迴
temp->next = pnode;// 將下一節點置為當前節點,既前置節點
return pnode;// 返回當前節點
}
單向鍊錶逆序問題
問題 將乙個單向單向鍊錶逆序倒轉,要求o n 的時間複雜度和o 1 的空間複雜度 該問題有兩種解法,一種非遞迴,一種是遞迴,如下 include include link.h typedef struct linknode linknode 遞迴 linknode reverselink linkn...
單向鍊錶逆序的3種實現
遍歷實現 node reverse node list return r 其實上面的這個操作自然地對應於棧的出棧 壓棧操作.基於棧思想的實現 1.判斷棧是否為空 bool isempty node stack 2.向棧stack中壓入乙個node元素 void push node stack,nod...
C語言鍊錶操作(新增單向鍊錶的逆序建立)
眾所周知,鍊錶是資料結構的基礎,掌握鍊錶很重要!include include typedef struct node node,linklist linklist build linklist int t linklist r,p,head null while fscanf fp,d t 0 r...