目錄
鍊錶型別的習題常用的技巧就是定義指標來代替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.鍊錶和陣列的區別?線性表包括陣列和鍊錶兩種,陣列是採用連續的儲存空間,陣列具有隨機儲存的特性,什麼是隨...