在O(1)时间删除链表节点
【题目】:
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该节点。
void deleteNode(ListNode* pListHead, ListNode* pToBeDeleted)
【解题思路】:
从三个方面来考虑:
- 如果待删除节点不是尾结点:将该节点的值由下一个节点的值来代替,然后指向下下个节点;
- 如果待删除节点是尾结点同时也是头节点,链表中只有一个节点: 将头节点置为NULL;
- 如果是尾巴节点,则需要遍历到尾节点前的一个节点,然后进行删除操作。
# defined a linklist
class NodeList(object):
def __init__(self, val):
self.val = val
self.next = None
# creat a linklist
def creat_linklist(list):
if not list:
return
head = p = NodeList(list[0])
for i in list[1:]:
p.next = NodeList(i)
p = p.next
return head
# print a linklist
def print_linklist(head):
if not head:
print("This is an empty linklist!")
return
while head:
print(head.val, end='->')
head = head.next
print(None)
# delete a node
def delete_a_node(head, node):
if not head and not node:
return
if node.next != None:
node.val = node.next.val
node.next = node.next.next
elif head == node:
head = None
else:
p = head
while p.next != node:
p = p.next
p.next = None
return head
# test
# 1. create a linklist
head = creat_linklist([1, 2, 3, 4, 5])
print_linklist(head)
# 2. delete a node in the middle of linklist
toBeDeleted = head.next.next
new_head = delete_a_node(head, toBeDeleted)
print_linklist(new_head)
# 3. delete a node in bottom of the linklist
toBeDeleted = head.next.next.next
new_head = delete_a_node(head, toBeDeleted)
print_linklist(new_head)
# 4. test a one node linklist
head = creat_linklist([1])
new_head = delete_a_node(head, head)
print_linklist(new_head)
运行结果: