單鏈表逆轉

2022-09-09 00:39:19 字數 1713 閱讀 2122

題目:定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。

畫個圖吧,假設存在單鏈表

a->b->c->d->e

如果不想任何指標,該如何如何定義之類的,那麼翻轉過程可以搞成如下:

|

a->b->c->d->e

|b->a->c->d->e

|c->b->a->d->e

|d->c->b->a->e

|e->d->c->b->a

然後我們假設有三顆指標。分別為:

c:當前

n:下乙個

l:上乙個

這時候我們重新定義上面的執行過程,那麼有:

a->b->c->d->e

c l n

|b->a->c->d->e

c l n

|c->b->a->d->e

c l n

|d->c->b->a->e

|e->d->c->b->a

仔細觀察上圖,就知道如何翻轉了。

還存在一種遞迴思路,思路參考到遞迴逆序列印單鏈表。。。比上面的迴圈好理解多了,不過時間複雜度沒有減弱~只是一種炫技而已。

a->b->c->d->e

a->b->c->d<-e (d->null)

a->b->c<-d<-e (c->null)

a->b<-c<-d<-e (b->null)

a<-b<-c<-d<-e (a->null)

**如下

#include #include #include #include using namespace std;

struct listnode

;listnode* createlistnode(int value)

void printlistnode(listnode* pnode)

else

}void printlist(listnode* phead)

printf("\nprintlist ends.\n");

}void addtotail(listnode** phead, int value)

else

}void turnoverlist(listnode* root)

p = root;

int vecsize = vec.size() - 1;

for (int i = vecsize; i >= 0; --i)

}// 遞迴翻轉鍊錶

// 不斷將當前節點往後挪

void rturnoverlist(listnode* p, listnode* &new_root)

if (p->m_pnext == null)

rturnoverlist(p->m_pnext, new_root);

p->m_pnext->m_pnext = p;

p->m_pnext=null;

return;

}listnode* rturnoverlist(listnode* root)

listnode* new_root = null;

rturnoverlist(root, new_root);

if (new_root != null)

return root;

}int main()

逆轉單鏈表

逆轉單鏈表 struct node reverse llist node head 此時temp表示以前的尾結點,p表示temp結點的前一結點 head temp 逆轉尾結點為頭結點 head next p 頭結點指標域指向p return head 逆轉迴圈鍊錶 struct node rever...

單鏈表逆轉

單鏈表逆轉 單鏈表逆轉,將單鏈表中各結點的next域改為指向其前驅結點。原先第乙個結點的next域為空,head改為指向原先的最後乙個結點。逆轉剛才如下圖所示 鍊錶類singlylist public class singlylist 構造單鏈表,由values陣列提供元素 public singl...

單鏈表逆轉

資料結構與演算法題目集 中文 list reverse list l 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode list 定義單鏈表型別 l是給定單鏈表,函式reverse要返回被逆轉後的鍊錶。i...