题目

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

示例:

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

方案一(迭代)

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeElements(head *ListNode, val int) *ListNode {
    dummyHead := &ListNode{}
    tail := dummyHead // 新链表当前尾节点
    for head != nil {
        if head.Val != val {
            tail.Next = head
            tail = head
        } else { // 防止尾节点是需要删除的节点
            tail.Next = nil
        }
        head = head.Next
    }

    return dummyHead.Next
}
  • 由于不能确定 head 节点(及 head.Next)是不是需要去除的节点,所以需要先定义一个 虚假的头结点(返回一个新的链表)
  • 最终需要返回的链表的头结点即为 dummyHead.Next

方案二(递归)

func removeElements(head *ListNode, val int) *ListNode {
    if head == nil {
        return head
    }

    head.Next = removeElements(head.Next, val)
    if head.Val != val {
        return head
    } else {
        return head.Next
    }
}

原文

https://leetcode-cn.com/explore/learn/card/linked-list/195/classic-problems/752/