题目

实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针。

例子:

输入:指向链表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;
  }

给定链表中间某结点指针,删除链表中该结点相关推荐

  1. C语言通过链表指针删除链表节点的算法(附完整源码)

    C语言通过链表指针删除链表节点的算法 C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) #in ...

  2. [链表|多解法] leetcode 19 删除链表的倒数第N个节点

    [链表|多解法] leetcode 19 删除链表的倒数第N个节点 1.题目 题目链接 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2-&g ...

  3. 《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点

    一.两个链表的第一个公共结点: 1.题目: 输入两个链表,找出它们的第一个公共结点. 2.解题思路: (1)第一种:找出两个链表的长度,然后让长的链表先走两个链表的长度差,接着两个链表一起走. (2) ...

  4. 不带头节点的链表有哪些缺点_14. 删除链表中重复的结点

    删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4-> ...

  5. 链表2--JZ25复杂链表的复制JZ36两个链表的第一个公共结点JZ55链表中环的入口结点JZ56删除链表中重复的结点

    JZ25复杂链表的复制 >>点击此链接 JZ36两个链表的第一个公共结点 题目描述 输入两个无环的单链表,找出它们的第一个公共结点.(注意因为传入数据是链表,所以错误测试数据的提示是用其他 ...

  6. 1.删除链表的奇数节点 2.删除链表的偶数节点

    1.删除链表的奇数节点 /** 删除奇数节点*/public static ListNode deleteOddNode(ListNode head) {if (head == null)return ...

  7. c语言用指针删除链表free,leetcode剑指 Offer 18(删除链表的节点)--C语言实现

    求: 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val = 5 ...

  8. Java每日一题——>19. 删除链表的倒数第 N 个结点

    这是LeetCode上的 [19,删除链表的倒数第 N 个结点],难度为 [中等] 题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 示例1 输入:head = [1,2,3, ...

  9. python实现带头结点的单链表的就地逆置_设头指针为head,编写算法实现带头结点单链表head的就地逆置...

    链表问题大全!!!刚出炉的还热乎呢!! #include #include typedef struct node { int nDate; struct node *pstnext; }Node; ...

  10. 双向链表删除节点时间复杂度_「十分钟学算法」删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1 ...

最新文章

  1. nginx 反向代理,动静态请求分离,proxy_cache缓存及缓存清除
  2. 编写测试:VC下获取文件大小的4种方法
  3. 中国大学MOOC 人工智能导论第六章测试
  4. ubuntu系统下如何修改host
  5. 在HTML中怎么去掉超链接的下划线?
  6. linux监控电脑配置,Zabbix基本配置及监控主机
  7. 使用SQL Server进行时间点恢复
  8. 在linux系统中创建文件夹,Linux系统中创建文件夹命令详解
  9. NOIp 2014 联合权值 By cellur925
  10. 拓端tecdat|python用遗传算法 神经网络 模糊逻辑控制算法对彩票乐透数据进行预测
  11. vertica常用sql语句总结
  12. 守望先锋为何如此火爆
  13. uniapp 打印小票
  14. 无聊却很有意思的事情
  15. 机器学习 28 个视频教程
  16. 【Python】Python基本概念、print()输出函数、标准数据类型、type()函数与isinstance()函数、数据类型转换、变量与变量名的命名规则、注释
  17. 初探docker部署gitlab
  18. 拥有一把工科生专属的尺子
  19. 填谷式无源pfc电路_基于无源填谷电路的PFC工作原理
  20. 还在担心网聊相亲的小姐姐,美女变恐龙!Python帮你潜伏侦查

热门文章

  1. 2021 年 5 月中国编程语言排行榜,C++ 超过 Java 没戏了...
  2. 2020年全球程序员收入报告出炉,字节跳动成唯一上榜中国公司
  3. 每日一皮:好像有个Bug... 你看到了吗?
  4. 安利 10 个 Intellij IDEA 实用插件
  5. YAML中多行字符串的配置方法总结
  6. 尴尬!中科院国产编程语言“木兰”引争议:声称完全自主,实则换皮Python?...
  7. TCP之三次握手四次挥手 1
  8. Spring Cloud Feign的文件上传实现
  9. Spring Boot 2.0正式发布,升还是不升呢?
  10. python3练习,python3练习题 - 来自菜鸟的独白