連結串列
203.移除連結串列元素
707.設計連結串列
206.反轉連結串列
這三道題都可以用單連結串列來解決。
這裡規定自己必須用dummyHead的方法來做連結串列題。題中沒規定head則只宣告一個dummyHead,題中有head,則宣告dummyHead指向它,並在最後返回之前將head=dummyHead.next。在實際查詢的過程中,需要new一個探子curr = dummyHead,讓它去不斷搜尋。
連結串列難點在於:根據需要的不同操作找到對應的節點。這裡假設連結串列index從0開始。
例如刪除index下標為a的節點x0,我們需要找到下標為a-1的節點y0。然後透過y0.next = y0.next.next來刪除x0節點。
而查詢index下標為a的節點x0,我們就需要找到其本身。
從dummyHead開始到index為a需要的步數為a步,也就是a次迴圈。到index為a-1的節點自然只需要a-1步
點選檢視程式碼
for(int i = 0;i<=index;i++)
{
// 從 dummyHead 到 index節點處
// 即可以查詢
currNode = currNode.next;
}
for(int i = 0;i<index;i++)
{
// 從 dummyHead 到 index 前一個節點處
// 即可以刪除
currNode = currNode.next;
}
根據需要,有時也可以為連結串列維護一個Length變數。
反轉連結串列的思路:以兩個節點為一組依次反轉,採用雙指標思想,一個pre指標表示組中前一個節點,curr表示後一個節點。每次反轉後一次後移,比較重要的是停止條件,停止條件是curr為null。因為curr到最後一個節點時,還沒進行最後一次反轉,所以用curr.next為null作為停止條件,會導致最後差一點沒反轉。最終則是返回pre作為反轉連結串列的新頭部。
點選檢視程式碼
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode pre = null;
ListNode curr = head;
ListNode temp;
while(curr!=null){
temp = curr.next;
curr.next = pre;
pre = curr;
curr = temp;
}
return pre;
}
}