先上题目
给出链表 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();