刪除鏈表中等于給定值val的所有節點。
Example:
給出鏈表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回刪除3之后的鏈表:1->2->4->5。
Function 如下:
public static void RemoveElements(LinkList<string> head, int val) { string value = val.ToString(); if (head.IsEmpty()) { Console.WriteLine("LinkList is Empty!"); } var p = new LinkListNode<string>(); var q = new LinkListNode<string>(); p = head.HeadLinkListNode; q = head.HeadLinkListNode.Next; int length = head.GetLength(); /********************for 循環***********************************/ for (int j = 1; j <= length; j++) { if (q == null) { break; } if (q.Data.Equals(value)) { p.Next = q.Next; q = q.Next; } else { p = p.Next; q = q.Next; } } /**************************while 循環****************************/ while (q != null) { if (q.Data.Equals(value)) { p.Next = q.Next; q = q.Next; } else { p = p.Next; q = q.Next; } } if (head.HeadLinkListNode.Data == value) { head.HeadLinkListNode = head.HeadLinkListNode.Next; } }*兩種循環皆可。for循環走了彎路,兩者思路差不多。畢竟思想的碰撞才會得出最佳方案。*傳入的head為null和不為空是一組判定,杜絕null引用拋異常。
*最開始我是以p為參考系依據判定匹配字符。發現到最后會丟失鏈表數據,原因是因為p作為頭指針,指向下一級元素,頭指針被替換(Remove)。
*反觀之后,我們逆向思考,以q(p.next)節點思考,下一級節點作為操作。把head留作最后處理。
*操作循環的依據是head下級節點不為null,即NEXT有值。
*循環體內就是是否匹配元素,不匹配pq相繼指向下一個元素。
*匹配之后直接跳過q,pq相繼指向q.next.q 作為參考判斷指針,必須逐級移動(檢索匹配)。p作為操作指針過濾節點。
*循環完成后,q為空,p為過濾掉的最后一個節點。此時head已經過濾完成,輸出數據即可。
p q 作為工具指針操作了鏈表head,最后返回head,即為所求。
新聞熱點
疑難解答