给定链表中间某结点指针,删除链表中该结点
题目
实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针。
例子:
输入:指向链表a->b->c->d->e中结点c的指针
结果:不需要返回什么,得到一个新链表:a->b->d->e
解答
这个问题的关键是你只有一个指向要删除结点的指针,如果直接删除它,这条链表就断了。 但你又没办法得到该结点之前结点的指针,是的,它连头结点也不提供。在这种情况下, 你只能另觅他径。重新审视一下这个问题,我们只能获得从c结点开始后的指针, 如果让你删除c结点后的某个结点,那肯定是没问题的。比如删除结点d,那只需要把c 的next指针指向e,然后delete d就ok了。好的,如果我们就删除结点d,我们将得到 a->b->c->e,和目标链表只差了一个结点。怎么办呢?把d的数据给c! 结点结构都是一样的,删除谁都一样,最关键的是结点中的数据,只要我们留下的是数据 a->b->d->e就OK了。
思路已经有了,直接写代码?等等,写代码之前,让我们再简单分析一 下可能出现的各种情况(当然包括边界情况)。如果c指向链表的:1.头结点;2.中间结点。 3.尾结点。4.为空。情况1,2属于正常情况,直接将d的数据给c,c的next指针指向d 的next指向所指结点,删除d就OK。情况4为空,直接返回。情况3比较特殊,如果c 指向尾结点,一般会认为直接删除c就ok了,反正c后面也没有结点了,不用担心链表断开。 可是真的是这样吗?代码告诉我们,直接删除c,指向c的那个结点(比如说b)的next指针 并不会为空。也就是说,如果你打印这个链表,它还是会打印出和原来链表长度一样的链表, 而且最后一个元素为0!
关于这一点,原书CTCI中是这么讲的,这正是面试官希望你指出来的。然后, 你可以做一些特殊处理,比如当c是尾结点时,将它的数据设置为一些特殊字符, 这样在打印时就可以不打印它。当然也可以直接不处理这种情况,原书里的代码就是这么做 的。这里,也直接不处理这种情况。代码如下:
1
2
3
4
5
6
7
8
|
bool remove(node *c){
if(c==NULL || c->next==NULL) return false;
node *q = c->next;
c->data = q->data;
c->next = q->next;
delete q;
return true;
}
|
完整代码如下:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#include <iostream>
using namespace std;
typedef struct node{
int data;
node *next;
}node;
node* init(int a[], int n){
node *head, *p;
for(int i=0; i<n; ++i){
node *nd = new node();
nd->data = a[i];
if(i==0){
head = p = nd;
continue;
}
p->next = nd;
p = nd;
}
return head;
}
bool remove(node *c){
if(c==NULL || c->next==NULL) return false;
// if(c->next==NULL){//c为最后一个元素时直接删除,不行,最后还是会打印出一个为0的结点,需要特殊处理
// delete c;
// return;
// }
node *q = c->next;
c->data = q->data;
c->next = q->next;
delete q;
return true;
}
void print(node *head){
while(head){
cout<<head->data<<" ";
head = head->next;
}
cout<<endl;
}
int main(){
int n = 10;
int a[] = {
9, 2, 1, 3, 5, 6, 2, 6, 3, 1
};
node *head = init(a, n);
int cc = 3;
node *c = head;
for(int i=1; i<cc; ++i) c = c->next;
print(head);
if(remove(c))
print(head);
else
cout<<"failure"<<endl;
return 0;
}
|
【Java参考代码】
1
2
3
4
5
6
7
8
9
|
public static boolean deleteNode(LinkedListNode n) {
if (n == null || n.next == null) {
return false; // Failure
}
LinkedListNode next = n.next;
n.data = next.data;
n.next = next.next;
return true;
}
|
给定链表中间某结点指针,删除链表中该结点相关推荐
- C语言通过链表指针删除链表节点的算法(附完整源码)
C语言通过链表指针删除链表节点的算法 C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) #in ...
- [链表|多解法] leetcode 19 删除链表的倒数第N个节点
[链表|多解法] leetcode 19 删除链表的倒数第N个节点 1.题目 题目链接 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2-&g ...
- 《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点
一.两个链表的第一个公共结点: 1.题目: 输入两个链表,找出它们的第一个公共结点. 2.解题思路: (1)第一种:找出两个链表的长度,然后让长的链表先走两个链表的长度差,接着两个链表一起走. (2) ...
- 不带头节点的链表有哪些缺点_14. 删除链表中重复的结点
删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4-> ...
- 链表2--JZ25复杂链表的复制JZ36两个链表的第一个公共结点JZ55链表中环的入口结点JZ56删除链表中重复的结点
JZ25复杂链表的复制 >>点击此链接 JZ36两个链表的第一个公共结点 题目描述 输入两个无环的单链表,找出它们的第一个公共结点.(注意因为传入数据是链表,所以错误测试数据的提示是用其他 ...
- 1.删除链表的奇数节点 2.删除链表的偶数节点
1.删除链表的奇数节点 /** 删除奇数节点*/public static ListNode deleteOddNode(ListNode head) {if (head == null)return ...
- c语言用指针删除链表free,leetcode剑指 Offer 18(删除链表的节点)--C语言实现
求: 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val = 5 ...
- Java每日一题——>19. 删除链表的倒数第 N 个结点
这是LeetCode上的 [19,删除链表的倒数第 N 个结点],难度为 [中等] 题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 示例1 输入:head = [1,2,3, ...
- python实现带头结点的单链表的就地逆置_设头指针为head,编写算法实现带头结点单链表head的就地逆置...
链表问题大全!!!刚出炉的还热乎呢!! #include #include typedef struct node { int nDate; struct node *pstnext; }Node; ...
- 双向链表删除节点时间复杂度_「十分钟学算法」删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1 ...
最新文章
- nginx 反向代理,动静态请求分离,proxy_cache缓存及缓存清除
- 编写测试:VC下获取文件大小的4种方法
- 中国大学MOOC 人工智能导论第六章测试
- ubuntu系统下如何修改host
- 在HTML中怎么去掉超链接的下划线?
- linux监控电脑配置,Zabbix基本配置及监控主机
- 使用SQL Server进行时间点恢复
- 在linux系统中创建文件夹,Linux系统中创建文件夹命令详解
- NOIp 2014 联合权值 By cellur925
- 拓端tecdat|python用遗传算法 神经网络 模糊逻辑控制算法对彩票乐透数据进行预测
- vertica常用sql语句总结
- 守望先锋为何如此火爆
- uniapp 打印小票
- 无聊却很有意思的事情
- 机器学习 28 个视频教程
- 【Python】Python基本概念、print()输出函数、标准数据类型、type()函数与isinstance()函数、数据类型转换、变量与变量名的命名规则、注释
- 初探docker部署gitlab
- 拥有一把工科生专属的尺子
- 填谷式无源pfc电路_基于无源填谷电路的PFC工作原理
- 还在担心网聊相亲的小姐姐,美女变恐龙!Python帮你潜伏侦查
热门文章
- 2021 年 5 月中国编程语言排行榜,C++ 超过 Java 没戏了...
- 2020年全球程序员收入报告出炉,字节跳动成唯一上榜中国公司
- 每日一皮:好像有个Bug... 你看到了吗?
- 安利 10 个 Intellij IDEA 实用插件
- YAML中多行字符串的配置方法总结
- 尴尬!中科院国产编程语言“木兰”引争议:声称完全自主,实则换皮Python?...
- TCP之三次握手四次挥手 1
- Spring Cloud Feign的文件上传实现
- Spring Boot 2.0正式发布,升还是不升呢?
- python3练习,python3练习题 - 来自菜鸟的独白