题目内容
删除链表中的节点:题目链接
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。 传入函数的唯一参数为要被删除的节点 。 现有一个链表 – head = [4,5,1,9],它可以表示为: 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.
提示
- 链表至少包含两个节点。
- 链表中所有节点的值都是唯一的。
- 给定的节点为非末尾节点并且一定是链表中的一个有效节点。
- 不要从你的函数中返回任何结果。
解题代码
这道题其实很简单,因为我们已经获得了要删除节点的信息,只需要我们将需要删除节点的值修改成其后继节点的值,将删除节点指向后继节点的指针指向后继节点的后继节点就可以了。代码如下:
#node为当前需要删除的节点
node.val = node.next.val
node.next = node.next.next
上面的代码只是删除节点的核心操作,接下来我们想要让代码可以真正的进行验证这段代码的正确性,我们需要得到链表的一个节点进行传参,所以我们的整段代码除了函数之外,还需实现:节点类、链表类(初始化、构造链表、查找一个节点并返回该节点、打印链表)。因为这里是已知节点信息删除节点,所以这里就做一个查找返回该节点做测试用例验证。代码如下:
#节点类
class ListNode:
def __init__(self,x):
self.val = x
self.next = None
#链表类
class Linklist:
def __init__(self):
self.head = None
def initlist(self,data):
self.head = ListNode(data[0])
r = self.head
p = self.head
for i in data[1:]:
node = ListNode(i)
p.next = node
p = p.next
return r
def printlist(self,head):
if head == None : return
print_res = []
node = head
while node != None:
print_res.append(node.val)
node = node.next
return print_res
def getnode(self,value):
if value is None:
return None
curr_node = self.head
while curr_node != None:
if curr_node.val == value:
return curr_node
curr_node = curr_node.next
return None
#删除链表节点函数
def deleteNode(node):
node.val = node.next.val
node.next = node.next.next
if __name__ == "__main__":
li = [4,5,1,9]
lilist = Linklist()
lii = lilist.initlist(li)
print(lii)
print(lilist.printlist(lii))
node = lilist.getnode(1)
deleteNode(node)
print(lilist.printlist(lii))
实验结果
由于这道题很简单且解法单一,只是在这里写个完整的代码验证方法正确性(其实也是为了凑一个勋章,赶紧发第四篇博文,这篇略短略糊弄,以此为戒 0.0),代码运行结果如下: