【试题描述】给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。
【试题来源】 未知
【试题分析】按照常规删除链表节点的方法没有办法在O(1)复杂度内完成,因此需要转换思路,将后面一个节点的内容复制过来,然后删除其后面的那个节点,以达到删除节点的目的。
【参考代码】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| struct ListNode { int value; ListNode* next; };
void deleteLinkNode(ListNode** pHeadNode, ListNode* pDeleteNode) {
if(pHeadNode == NULL || pDeleteNode == NULL) { return ; }
if(pDeleteNode == *pHeadNode) { delete pDeleteNode; pDeleteNode = NULL; *pHeadNode = NULL; } else if(pDeleteNode->next == NULL) { ListNode* pNode = *pHeadNode; while(pNode->next != pDeleteNode) { pNode = pNode->next; } pNode->next = NULL; delete pDeleteNode; pDeleteNode = NULL; } else { ListNode* pNode = pDeleteNode->next;
pDeleteNode->value = pNode->value; pDeleteNode->next = pNode->next;
delete pNode; pNode = NULL; } }
|