5-1 Leetcode中和链表相关的问题

lectcode 203. 移除链表元素

删除链表中等于给定值 val 的所有节点。

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

 方法1 不采用虚拟头结点

1 public class ListNode {
2 
3     public int val;
4     public ListNode next;
5 
6     public ListNode(int x) {
7         val = x;
8     }
9 }
 1 class Solution {
 2 
 3     public ListNode removeElements(ListNode head, int val) {
 4               //1.首先考虑头结点(循环的开始部分)
 5         while(head != null && head.val == val){  //如果head的值=val,同时访问head.val有一个默认条件:head要满足head不为空。删除头结点后,新的头结点可能还有head.val == val,所以用while,不用if
 6             ListNode delNode = head;
 7             head = head.next;
 8             delNode.next = null;//delNode和链表断掉关系
 9         }
10 
11         if(head == null) //head == null:头结点为空,即整个链表为空,此时后面的逻辑就不需要运行了,直接返回head
12             return head; //其实就是返回null
13           //2.删除链表中间的节点值等于val
14         ListNode prev = head;
15         while(prev.next != null){      //while循环删除链表中间值等于val的节点
16             if(prev.next.val == val) {
17                 ListNode delNode = prev.next;
18                 prev.next = delNode.next;
19                 delNode.next = null;
20             }
21             else
22                 prev = prev.next;
23         }
24 
25         return head;
26     }
27 }

其实

等价于

2.采用虚拟头结点

 1 class Solution3 {
 2 
 3     public ListNode removeElements(ListNode head, int val) {
 4 
 5         ListNode dummyHead = new ListNode(-1);//dummyHead是虚拟头结点,永远不会访问它的值,所以在这里随便给了一个值,给-1.
 6         dummyHead.next = head;
 7 
 8         ListNode prev = dummyHead;
 9         while(prev.next != null){    //while循环删除链表中间值等于val的节点
10             if(prev.next.val == val)
11                 prev.next = prev.next.next;
12             else
13                 prev = prev.next;
14         }
15 
16         return dummyHead.next;
17     }
18 }
带女朋友搬家新家条件不好,累到女朋友了,让女朋友受苦了,特此明志:每天学习,明年这个时候(20190812)让女朋友住上大房子,永远年轻,永远热泪盈眶,很多人都是这样,他们都把自己当成身在梦中一样,浑浑噩噩地过日子,只有痛苦或爱或危险可以让他们重新感到这个世界的真实。
原文地址:https://www.cnblogs.com/make-big-money/p/10325148.html