给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
注意:此题对比原题有改动
示例 1:
输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:
输入: head = [4,5,1,9], val = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.说明:
- 题目保证链表中节点的值互不相同
- 若使用 C 或 C++ 语言,你不需要
free
或delete
被删除的节点
思路:
- 双指针法:利用 pre, mid 遍历链表
- 递归法
时间复杂度:
- 双指针法:O(n)
- 递归法:O(n)
空间复杂度:
- 双指针法:O(1)
- 递归法:O(logn)
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
// 方法1 迭代
func deleteNode(head *ListNode, val int) *ListNode {
// 若头结点是待删除节点
if head.Val == val {
return head.Next
}
var pre, mid *ListNode = nil, head
for mid != nil {
if mid.Val == val {
pre.Next = mid.Next
return head // 直接返回
}
pre = mid
mid = mid.Next
}
return nil
}
// 方法2 递归
func deleteNode(head *ListNode, val int) *ListNode {
if head.Val == val {
return head.Next
}
head.Next = deleteNode(head.Next, val)
return head
}