博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题15:在O(1)时间删除链表结点
阅读量:4216 次
发布时间:2019-05-26

本文共 1347 字,大约阅读时间需要 4 分钟。

题目:

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点结构如下:

struct ListNode{	int value;	ListNode *next;};
思路:

这题不难,关键是能不能想到那个点上。

这题关键点不是删除给定指针对应的那个结点(如果这样,必须知道其前一个结点,显然O(1)时间无法完成)。

如果将后一个结点的值赋给前一个结点,然后删除后一个结点,就可以了。

#include 
#include
#include
#include
#include
using namespace std;struct ListNode{ int value; ListNode *next; ListNode(int a){ value = a; next = NULL; }};void deleteNode(ListNode *head, ListNode *toBeDeleted){ if (!head || !toBeDeleted) return; if (toBeDeleted->next == NULL)//删除尾结点 { ListNode *p = head; if (head == toBeDeleted) { delete head; head = NULL; } while (p->next != toBeDeleted) p = p->next; p->next = NULL; delete toBeDeleted; return; } ListNode *nextOfDelete = toBeDeleted->next; toBeDeleted->value = nextOfDelete->value; toBeDeleted->next = nextOfDelete->next; delete nextOfDelete;}int main(){ ListNode *a1 = new ListNode(1); ListNode *a2 = new ListNode(2); ListNode *a3 = new ListNode(3); ListNode *a4 = new ListNode(4); ListNode *a5 = new ListNode(5); a1->next = a2; a2->next = a3; a3->next = a4; a4->next = a5; deleteNode(a1, a5); for (ListNode*p = a1; p; p = p->next) cout << p->value << " "; cout << endl; return 0;}

需要说明的是,如果被删除的是最后一个,时间复杂度是O(n),不过平均复杂度仍然是O(1)。
如果删除的是头结点,因为删除的始终是下一个,所以不需要重新更新头结点。

还要考虑一种情况,只有一个结点,被删除和头结点都指向该结点。

转载地址:http://iapmi.baihongyu.com/

你可能感兴趣的文章
Spark Shuffle及其调优
查看>>
数据仓库分层
查看>>
常见数据结构-TrieTree/线段树/TreeSet
查看>>
Hive数据倾斜
查看>>
TopK问题
查看>>
HQL排查数据倾斜
查看>>
DAG以及任务调度
查看>>
LeetCode——DFS
查看>>
MapReduce Task数目划分
查看>>
ZooKeeper分布式锁
查看>>
3126 Prime Path
查看>>
app自动化测试---ADBInterface驱动安装失败问题:
查看>>
RobotFramework+Eclipse安装步骤
查看>>
测试的分类
查看>>
photoshop cc2019快捷键
查看>>
pycharm2019版本去掉下划线的方法
查看>>
九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
查看>>
leetcode 13: Roman to Integer
查看>>
a标签中调用js方法
查看>>
js函数中传入的event参数
查看>>