C 資料結構之鍊錶詳解

2022-09-26 00:51:13 字數 3915 閱讀 7467

目錄

鍊錶型別的習題常用的技巧就是定義指標來代替head的,替head走,要麼就是數學問題,環形鍊錶就是利用數學思想取解決的,要麼就是定義雙指標來操作鍊錶。

定義兩個變數,乙個使待刪除的節點,乙個為待刪除節點的前驅節點,最後記得判斷頭節點是否為要刪除的節點,最後返回頭節點。

public listnode removeelements(listnode head, int val)

listnode cur=head.next;

listnode prev=head;

while(cur!=null)else

cur=cur.next;

}if(head.val==val)

return head;

}定義雙指標法,類似於頭插法,來將鍊錶的節點頭插法

cur節點是待反轉的節點 curnext是儲存下乙個節點的位址值

1.先儲存待反轉節點下乙個位址值,之後將頭節點的next置空

2.只有用頭插法將節點頭插即可。

public listnode reverselist(listnode head)

listnode cur=head;//要頭插的節點

listnode curnext=head.next;//儲存下乙個節點的位址值

cur=curnext;

head.next=null;

while(cur!=null)

return head;

}定義快慢指標,注意偶數節點和奇數節點的情況

注意判斷條件 在偶數情況下 如果是判斷fast.next.next就會空指標異常,必須把判斷條件兩個都加上。

public listnode middlenode(listnode head)

listnode slow=head;

listnode fast=head;

while(fast!=null&&fast.next!=null)

return slow;

}定義快慢指標 快指標先走n-1步 之後慢指標再走,修改位址值即可

public listnode removenthfromend(listnode head, int n)

listnode fast=head;

listnode dummy=new listnode(0,head);

listnode slow=dummy;

for(int i=1;i

給定x值,分割鍊錶 前面鍊錶為小於x的值,後面鍊錶為大於等於x的值

要考慮很多情況

1.第一次插入鍊錶時 要將頭節點和尾巴節點都指向插入的節點

2.不是第一次插入時,只需要把尾巴節點next值指向插入的節點,之後把尾巴節點往後挪

3.如果前面鍊錶為空,返回後面鍊錶的頭

4。還需要將後面節點的next值置空,之後連線兩個鍊錶。

public listnode partition(listnode head, int x)

listnode xh=null;//小於x的頭節點

listnode xe=null;;//小於x的尾巴節點

listnode xh=null;//大於等於x的頭節點

listnode xe=null;//大於等於x的尾節點

listnode cur=head;

while(cur!=null)

}elseelse

}cur=cur.next;

}//判斷 所有元素都大於x 前面的鍊錶沒有資料 要返回後面的鍊錶

if(xh==null)

xe.next=xh;

if(xh!=null)

return xh;

}和合併有序陣列是一樣的,鍊錶複雜一些要將後面節點位址先儲存,之後定義傀儡節點,按照值小的順序連線起來

public listnode mergetwolists(listnode l1, listnode l2) else

dummy=dummy.next;

}if(l1!=null)

if(l2!=null)

return head.next;

}雙指標 遇到相等的就跳過 ,最後要將最後乙個節點置為空。

public listnode deleteduplicates(listnode head)

listnode prev=head;

listnode cur=head.next;

while(cur!=null)else

}prev.next=cur;

return head;

}先用set判斷是否存在 空間複雜度為o(n),不太符合題目要求

public boolean hascycle(listnode head)

}return false;

}2.快慢指標數學問題,快指標走兩步,慢指標走一步,有環一定相遇,沒有環就不會相遇 空間複雜度為o(1)

public boolean hascycle(listnode head)

listnode slow=head;

listnode fast=head.next;

while(slow!=fast)

fast=fast.next.next;

slow=slow.next;

}return true;

}1.先利用set儲存節點 之後迴圈判斷,空間複雜度為o(n)時間複雜度為o(n),比較慢

public listnode getintersectionnode(listnode heada, listnode headb)

while(headb!=null)

headb=headb.next;

}return null;

}2.雙指標,確實沒想出來,看了題解才知道是兩個鍊錶相連線,遍歷是否有想交的節點

public listnode getintersectionnode(listnode heada, listnode headb)

return cur1;

}這道題沒什麼技巧,就是注意很多特殊情況,加完要判斷進製,我第一次敲的時候能執行但是不能過,沒有考慮到特殊情況。

最後看評論解答就是用乙個進製標誌數來解決,學到了。

public listnode addtwonumbers(listnode l1, listnode l2)

if(l2!=null)

list.next=new listnode(t%10);

list=list.next;

t/=10;

}return head.next;

}1.可以將鍊錶中值存放在順序表中,之後定義雙指標遍歷判斷

2.快慢指標帶反轉

3.利用棧實現li

public boolean ispalindrome(listnode head)

listnode cur1=head;

while(cur1!=null)

cur1=cur1.next;

}return true;

}定義快慢指標,之後反轉鍊錶來實現

public boolean ispalindrome(listnode head)

listnode fast=head;

listnode slow=head;

while(fast.next!=null&&fast.next.next!=null)

//走到中間節點,反轉鍊錶

slow=reverse(slow.next);

while(slow!=null)

head=head.next;

slow=slow.next;

}return true;

}public listnode reverse(listnode head)

return head;

}本文標題: c++資料結構之鍊錶詳解

本文位址:

資料結構之 鍊錶詳解

cpp view plain copy typedef struct lnode cpp view plain copy void initlist linklist l 樂樂站在第乙個,星星站在樂樂 的前面,呆子站在星星的前面 依次排列,這樣樂樂會最終站在隊尾 這就是頭插法建立單鏈表 cpp vi...

資料結構詳解 鍊錶

鍊錶其實和陣列一樣,可以儲存一串元素.但又與陣列不同,那就是陣列是以下標進行儲存的,例如a 1 a 2 a 3 等,而鍊錶則是根據許多數字的前後關係的數字進行儲存的,其原理類似於圖論中的鄰接表,所儲存的序列並不是有序的,而是儲存這個數的前面 next 和這個數的後面 pre 來得到這一串有序的序列的...

資料結構 鍊錶詳解

1.什麼是鍊錶?鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。2.鍊錶和陣列的區別?線性表包括陣列和鍊錶兩種,陣列是採用連續的儲存空間,陣列具有隨機儲存的特性,什麼是隨...