题目描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
案例3:
输入:head = [7,7,7,7], val = 7
输出:[]
提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
思路
两种思路;使用虚拟头节点和不使用虚拟头节点。两种方式的共同思路是:首先定义变量,然后通过遍历链表,如果该节点的值等于要删除的值,就使前一个节点的下一个节点等于该节点的下一个节点,从而实现链表中数据的删除
java参考代码
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { //添加虚拟节点方式 时间复杂度O(n) 空间复杂度O(1) public ListNode removeElements(ListNode head, int val) { if(head == null){ return head; } ListNode dummy = new ListNode(-1,head); ListNode pre = dummy; ListNode cur = head; while(cur != null){ if(cur == val){ pre.next = cur.next; }else{ pre = cur; } cur = cur.next; } return dummy.next; } 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.next; } curr = curr.next; } return head; } }
go参考代码:
go中需要自己实现结构体的定义
type ListNode struct { Val int Next *ListNode } func removeElements(head *ListNode,val int) *ListNode { dummyHead := &ListNode{} dummyHead.Next = head cur := dummyHead for cur!= nil && cur.Next != nil{ if cur.Next.Val == val{ cur.Next = cur.Next.Next }else{ cur = cur.Next } } return dummyHead.Next }
以上分析,希望对您有所帮助,您的支持是我最大的动力,感谢一键三连!!