链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 -- 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.
说明:
根据题意,给定一个节点,我们需要将其删除,题目已经说明了链表中的节点值是唯一的,链表至少包含两个节点,同时被删除的节点不会是末尾节点。我们常规的思路是,遍历一边链表,直接将节点删除即可。但是,大家注意下,这里只给了我们这个被删除的节点,而没有给我们链表的头节点,所以我并不能对链表从头到尾进行遍历。
假设我们有一个链表如下:
1->2->3->4->5->6->7,被删除节点为3,现在我们是可以拿到节点 3 以及节点 3 之后的所有节点。
现在我们该怎么做呢?
其实,思路很简单,我们把节点 3 的值变成节点 4 的值,之后再把节点 3链接到节点 5,这样我们就偷梁换柱,删除了节点 3。
链表变成如下:1->2->4->4->5->6->7,之后重新将第一个 4 指向 5即可。
时间复杂度:O(1)
空间复杂度:O(1)
Python:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val=node.next.val
node.next=node.next.next
Go:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func deleteNode(node *ListNode) {
node.Val=node.Next.Val
node.Next=node.Next.Next
}
如果觉得文章不错,希望大家可以扫描上方名片关注我的微信公众号噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会及时回复的,同时会不定期更新更多的文章,祝我们终将自由。