免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2855 | 回复: 8

[算法] 链表逆序问题,求指教 (下一期讨论TLV报文) [复制链接]

论坛徽章:
0
发表于 2014-09-17 22:11 |显示全部楼层
将一带链表头List head的单向链表逆序。

分析


  1). 若链表为空或只有一个元素,则直接返回;

  2). 设置两个前后相邻的指针preNode ,pNextNode . 将preNode 所指向的节点作为pNextNode 指向节点的后继;

  3). 重复2),直到pNextNode 为空

  4). 调整链表头和链表尾

  部分实现代码:
  typedef struct tagList
  {
    int data;
    struct tagList *pNext;
   }List_Node;

  List_Node *Head;
(1) 先构造一个带头结点的链表,代码略(我想这个学过C语言的都会)
(2)Deamo:

       List_Node *ReverseList(List_Node * Head)
       {
           List_Node *pTemp = NULL;
           List_Node *preNode = Head->pNext;
           List_Node *pNextNode = Head->pNext->pNext;
           /* 如果链表为空或则只有一个节点,则直接返回 */
           if (NULL == Head->pNext || Head->pNext->Next)
              return Head;
          /* 当循环结束时,此时preNode 指向原始链表最后一个节点*/
           while(NULL != pNext)
           {
              pTemp = pNextNode ->pNext;
              pNextNode ->pNext = preNode ;
              preNode = pNextNode ;
              pNextNode = pTemp ;
           }
         
          /*设置链表尾*/
          Head->pNext->pNext = NULL;
         
          /*设置链表头*/
         Head->pNext = preNode ;
         return Head;
       }


论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-09-18 09:50 |显示全部楼层
本帖最后由 lxyscls 于 2014-09-18 09:51 编辑
  1. List_Node *ReverseList(List_Node * Head)
  2. {
  3.     List_Node *r = NULL;
  4.     List_Node *n, *h = head;

  5.     while (h) {
  6.         n = h->next;
  7.         h->next = r;
  8.         r = h;
  9.         h = n;
  10.     }
  11.     return r;
  12. }
复制代码
为什么要带头?链表反转的核心是把链表分为左右两部分...

论坛徽章:
0
发表于 2014-09-18 16:25 |显示全部楼层
回复 1# zhangtongjian


    代码不够严谨

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
发表于 2014-09-18 21:01 来自手机 |显示全部楼层
最简单的还是双向循环链表,不管正反,通吃。

论坛徽章:
0
发表于 2014-09-19 21:12 |显示全部楼层
分成左右俩部分是什么意思??回复 2# lxyscls


   

论坛徽章:
0
发表于 2014-09-19 21:13 |显示全部楼层
哪地方不严谨尼  求支出回复 3# 0n10rz1r0


   

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
发表于 2014-09-20 09:07 |显示全部楼层
本帖最后由 zhaohongjian000 于 2014-09-20 09:08 编辑

回复 6# zhangtongjian
  1.             
  2.            List_Node *pNextNode = Head->pNext->pNext;
  3.            /* 如果链表为空或则只有一个节点,则直接返回 */
  4.            if (NULL == Head->pNext || Head->pNext->pNext)
  5.               return Head;
复制代码
如果Head->pNext为NULL,第一行就core dump了。


另外,单链表带空头节点是跟着书上学的。但,也许是我孤陋寡闻,这些年见过的实现都没有空头节点。


(更新:代码里面不能给文字加颜色,真蛋疼)

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-09-22 14:47 |显示全部楼层
zhangtongjian 发表于 2014-09-19 21:12
分成左右俩部分是什么意思??回复 2# lxyscls

当然是已经逆转的部分和未逆转的部分咯

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
发表于 2014-09-22 19:58 来自手机 |显示全部楼层
如果是我,我会这样写:(手机写的,没编译,但算法是对的)
int ReverseLink(List_Node **io_list)
{
    List_Node *list_old,*list_new,*node;

    list_old = *io_list;
    list_new = NULL;

    while (list_old != NULL) {
       node = list_old;
       list_old = list_old-〉pNext;
       node-〉pNext = list_new;
       list_new = node;
    }

    *io_list = list_new;
    return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP