标签:虚拟头结点 lse ext 逻辑 ima while循环 nbsp 方法 elements
删除链表中等于给定值 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 }
class Solution { public ListNode removeElements(ListNode head, int val) { //1.首先考虑头结点(循环的开始部分) while(head != null && head.val == val){ //如果head的值=val,同时访问head.val有一个默认条件:head要满足head不为空。删除头结点后,新的头结点可能还有head.val == val,所以用while,不用if ListNode delNode = head; head = head.next; delNode.next = null;//delNode和链表断掉关系 } if(head == null) //如果链表中所有节点都是要删除的节点,那么运行到这里时链表已经为空了,有head == null,此时后面的逻辑就不需要运行了,直接返回head return head; //2.删除链表中间的节点值等于val ListNode prev = head; while(prev.next != null){ //while循环删除链表中值为val的节点 if(prev.next.val == val) { ListNode delNode = prev.next; prev.next = delNode.next; delNode.next = null; } else prev = prev.next; } return head; } }
其实
等价于
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 }
标签:虚拟头结点 lse ext 逻辑 ima while循环 nbsp 方法 elements
原文地址:https://www.cnblogs.com/make-big-money/p/10325148.html