请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 -- head = [4,5,1,9],它可以表示为:
示例 1:
输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:
- 链表至少包含两个节点。
- 链表中所有节点的值都是唯一的。
- 给定的节点为非末尾节点并且一定是链表中的一个有效节点。
- 不要从你的函数中返回任何结果。
python解决方法
class Solution(object):
def deleteNode(self, node):
node.val = node.next.val
node.next = node.next.next
难度简单29收藏分享切换为英文关注反馈
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
注意:此题对比原题有改动
示例 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.
思路:创建两个指针pre和cur,当cur的值=val,退出循环,判断cur是否为最后一个node,如果是pre指向None即为删除,如果不是,pre指向cur指向的node
def deleteNode(self, head, val):
"""
:type head: ListNode
:type val: int
:rtype: ListNode
"""
if head.val == val:
return head.next
pre = head
cur = head.next
while cur and cur.val!=val:
pre = pre.next
cur = cur.next
pre.next = cur.next
return head
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
python解决方法1:迭代
注意:一定要创建一个空node,这样链表头就可以变成普通node,处理起来方便。
class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
if not head:
return head
dummy = ListNode(0)
dummy.next = head
pre,cur = dummy,dummy.next
while cur:
if cur.val == val:
pre.next = cur.next
cur = pre.next
else:
pre = pre.next
cur = cur.next
return dummy.next
解决方法2:递归
class Solution:
def removeElements(self, head: ListNode, val: int) -> ListNode:
if not head:
return
head.next = self.removeElements(head.next, val)
return head.next if head.val == val else head
剑指 Offer 18和203. 移除链表元素的不同之处在于,18默认链表中只有一个node的值=val,可找到该值,退出循环然后删除,而203要求遍历全部链表,找到一个删除一个,遍历时删除。