# 题目一:在O(1)时间内删除链表节点
# 给定单向链表的头指针和一个节点指针,在O(1)的时间复杂度内删除该节点。
# a->b->c, 想要删除a,只需要把b的值赋给a,然后指向c就可以了,即 b->b->c, 再b->c
# 这里需要注意的是,删除第一个节点,删除最后一个节点怎么办。如果是尾节点,需要遍历链表,至于第一个节点,由于我的代码里的链表是带头节点的,所以删除第一个节点不需要特别考虑
class Node:
def __init__(self, data, next):
self.data = data
self.next = next
# 包含头结点的链表
class LinkList:
def __init__(self, input):
self.headNode = Node(None, None)
if input is None:
pass
else:
work = self.headNode
for i in input:
newnode = Node(i, None)
work.next = newnode
work = work.next
def travelLinkList(self):
work = self.headNode
while work.next is not None:
print(work.next.data)
work = work.next
def find_value(self, x):
work = self.headNode
while work.next is not None:
if work.next.data == x:
return work.next
else:
work = work.next
class Solution:
def delte_node(self, head_node, p_node):
if p_node is None or head_node is None:
return
else:
if p_node.next is None: # 如果p_node是最后一个节点,那就遍历链表
work = head_node.next
while work.next.data != p_node.data:
work = work.next
work.next = None
else:
p_node.data = p_node.next.data # 把p_node下一个节点的赋给p_node
p_node.next = p_node.next.next
if __name__ == '__main__':
# 测试用例,删除1, 4, 7
array = [1, 2, 3, 4, 5, 7]
link_list = LinkList(array)
p_delete_node = link_list.find_value(1)
s = Solution()
s.delte_node(link_list.headNode, p_delete_node)
link_list.travelLinkList()
剑指offer:018-1在O(1)时间内删除链表节点
最新推荐文章于 2021-11-28 15:28:56 发布