關於單向鍊錶的逆序

2021-05-24 11:37:54 字數 1105 閱讀 2249

本文**: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...