这是链表的第18题,力扣链接。
给你一个链表的头节点
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 输出:[]
看到这道题的第一反应就是遍历一边数组,删除点无用的节点。
func removeElements(head *ListNode, val int) *ListNode {
result := &ListNode{Next: head}
cur := result
for cur.Next != nil {
if cur.Next.Val == val {
cur.Next = cur.Next.Next
} else {
cur = cur.Next
}
}
return result.Next
}
这个做法是模拟头节点的逻辑,当然,还有别的做法,就是先删头节点再删尾节点。
func removeElements(head *ListNode, val int) *ListNode {
for head != nil && head.Val == val {
head = head.Next
}
if head == nil {
return head
}
cur := head
for cur.Next != nil {
if cur.Next.Val == val {
cur.Next = cur.Next.Next
} else {
cur = cur.Next
}
}
return head
}
自然,还有一些递归的思维。
func removeElements(head *ListNode, val int) *ListNode {
if head == nil {
return head
}
head.Next = removeElements(head.Next, val)
if head.Val == val{
return head.Next
}
return head
}