码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-01-13 17:17:20      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

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

 样例:

  输入:指向链表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是尾结点时,将它的数据设置为一些特殊字符, 这样在打印时就能够不打印它。当然也能够直接不处理这样的情况,原书里的代码就是这么做 的。这里,也直接不处理这样的情况。

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;
}



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

标签:

原文地址:http://www.cnblogs.com/bhlsheji/p/4221745.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!