先上題目
給出鏈表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回刪除3之后的鏈表:1->2->4->5。
嘗試這做了一些,下面上代碼
public static ListNode Remove(ListNode head, int val) { ListNode A = head; ListNode b = null; //排除表頭值相等 //先不去管當前的表頭的 val是否相等; while (A.next != null) { if (A.next.val == val) { //b就是相等的結點 b = A.next; //判斷b的next是否為空 if (b.next == null) { //這里為什么不寫b.next=Null; //進行到這里就要跳出循環了 // 現在我們的b沒有進行任何賦值操。 //b再這里不屬於鏈表的 //A.屬於鏈表 A.next = null; break; } //把b的下一個結點給a的下一個結點。 //A.next 結點存儲的當前val相等的結點的位置 // A.next = b.next; 就是把當前 b.next的地址給A.next, //原本存在A.next里面的結點,指向的位置發生了改變,到了b.next的位置 A.next = b.next; } else { //就是循環鏈表 A = A.next; } } //最后再考慮當前的表頭的val是否相等 //如果相當,就把表頭的next結點的地址給head, if (head.val == val) { head = head.next; } return head; }
ListNode a = new ListNode(3); ListNode b = new ListNode(2); ListNode c = new ListNode(3); ListNode d = new ListNode(3); ListNode e = new ListNode(3); ListNode f = new ListNode(5); ListNode g = new ListNode(3); a.next = b; b.next = c; c.next = d; d.next = e; e.next = f; f.next = g; ListNode head= Remove(a, 3); ListNode s = head; //Console.WriteLine(s.next.val); ListNode B = new ListNode(0); B = head; while (B != null) { Console.WriteLine(B.val); B = B.next; ; } //Console.WriteLine(s.val); Console.ReadKey();