題目:定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。
畫個圖吧,假設存在單鏈表
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->ec 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->ea->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...