反轉鍊錶(欠反轉地球的債)

2022-03-09 02:07:44 字數 1152 閱讀 6968

github鏈結

當年沒寫的反轉地球還是要補,跑不掉啊。

輸入部分:用結構體陣列存。

建立鍊錶:先建立乙個只有首個元素的鍊錶,再乙個乙個插入節點。插入時用指標從陣列頭往後找。直到-1結束。

反轉鍊錶:用四個指標p(依次往後移動),p1(需要反轉的節點),p2(反轉的節點將到達位置的後乙個節點),p3(反轉的節點將到達位置的前乙個節點),這樣k個節點反轉時,開始p指向第乙個,p1=p->next;然後把p1取出(p->next=p1->next),然後用p3,p2確定p1將到達位置(p1->next=p2,p3->next=p1),注意第一次反轉頭指標在變,因為沒有頭節點,還有四個指標的移動。詳情參看**。

當然,打**的道路總是不平坦的。

跳過**不成形環節。講能反轉之後的情況。

一開始忽略了反轉以後對應的位址也要跟著改變,這時候只要在每次改變鍊錶順序時,相應的next也改下就好了。例如:p->next=p1->next,這時候要跟上一句:p->next=p1->next。(大寫next為指標,小寫next為下個位址)。

跑去提交發現第五個測試點超時了,檢查覺得建立鍊錶很麻煩,每次都要把陣列找一遍。在隊長提示下用了陣列下標。將下標用他們首位址表示,這樣建立的時候,直接找下標為當前結點的next就好了。依舊-1停止。但是因為不是所有節點有效,所以用num記錄。

輸入部分

for (i = 0; i建立鍊錶函式

node *create(int first)//建立鍊錶

p1->next = null;

return head;

}

反轉鍊錶函式

node *reverse(node *head, int k, int num)

else

j++;

}p3 = p;

p = p->next;

p2 = p;

}return head;

}

第一次寫了卡死電腦的程式,還是蠻開心的。

反轉鍊錶與分組反轉鍊錶

經典的反轉鍊錶,先上 public class listnode public class printlist system.out.println public class reverse public listnode reverse listnode root listnode pre nul...

反轉鍊錶和部分反轉

listnode reverselist listnode head if head next nullptr listnode p head listnode q p next listnode r nullptr p next nullptr while q return p 關鍵點 1.雖是三...

鍊錶的反轉

鍊錶的反轉是乙個經常被問到的乙個面試題,也是乙個非常基礎的問題。比如乙個鍊錶是這樣的 1 2 3 4 5 通過反轉後成為5 4 3 2 1。最容易想到的方法遍歷一遍鍊錶,利用乙個輔助指標,儲存遍歷過程中當前指標指向的下乙個元素,然後將當前節點元素的指標反轉後,利用已經儲存的指標往後面繼續遍歷。源 如...