题目:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
不添加虚拟结点:
//时间O(n) 空间O(1) public ListNode removeElements(ListNode head, int val) { while(head!=null && head.val==val){ head = head.next; } ListNode curr = head; while(curr!=null){ while(curr.next!=null && curr.next.val == val){//删除的就是curr.next curr.next = curr.next.next; } curr = curr.next; } return head; }
添加虚拟结点:
添加虚拟结点指向头结点,这样头结点和其他结点就一样了,删除操作规则会比较统一。
要删除一个元素,需要知道它前一个元素是谁,所以删除cur.next而非cur。
//时间O(n) 空间O(1)
public ListNode removeElements(ListNode head, int val) { if (head == null) { return head; } // 因为删除可能涉及到头节点,所以设置dummy节点,统一操作 ListNode dummy = new ListNode(-1, head); dummy.next=head;//虚拟节点指向头结点 ListNode cur = dummy;//让cur指针遍历链表 while (cur.next!= null) { if (cur.next.val == val) { cur.next = cur.next.next; } else { cur=cur.next; } } return dummy.next; }
标签:力扣,head,curr,cur,val,next,链表,移除,ListNode From: https://www.cnblogs.com/cjhtxdy/p/16878111.html