題目
- 從尾到頭打印鏈表_牛客網
https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=11156&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking - reorder-list_牛客網
https://www.nowcoder.com/practice/3d281dc0b3704347846a110bf561ef6b?tpId=46&tqId=29037&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking
思路1:藉助棧
利用棧先進後出的特點,將每個節點按順序存入棧中,再從頂到底連接棧中的每個節點
注意倒數第二行代碼 p->next=nullptr!!!要將翻轉後的最後一個節點(即原鏈表的第一個節點)的next置爲nullptr,不然後果可想而知~
ListNode* reverseList(ListNode* head){
stack<ListNode*> stk;
ListNode *reverseHead=new ListNode(0),*p=reverseHead,*tmp;
while(head){
stk.push(head);
head=head->next;
}
while(!stk.empty()){
tmp=stk.top();
p->next=tmp;
stk.pop();
p=p->next;
}
p->next=nullptr;
return reverseHead->next;
}
思路2:就地操作(推薦)
- 逐個斷開原鏈表的每個節點(保存下個節點)
- 將斷開的節點連接到反轉鏈表的表頭上
- 更新反轉鏈表的表頭
- 回到原鏈表的下個節點
ListNode* reverseList(ListNode* head){
ListNode* p=nullptr,*tmp;
while(head){
tmp=head->next;
head->next=p;
p=head;
head=tmp;
}
return p;
}