Chinaunix首页 | 论坛 | 博客
  • 博客访问: 920931
  • 博文数量: 194
  • 博客积分: 7991
  • 博客等级: 少将
  • 技术积分: 2067
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-09 22:03
文章分类

全部博文(194)

文章存档

2010年(8)

2009年(71)

2008年(109)

2007年(6)

我的朋友

分类:

2008-02-25 09:22:09

 
利用三个连续指针cur、fw1、fw2,从头(设定为slink)开始指向三个节点,然后进行反转操作,循环进行:
 

//最开始的状态
cur = slink;
fw1 = slink->next;
fw2 = fw1->next;
slink->next = NULL;

//反转一次
fw1->next = cur;
cur = fw1;
fw1 = fw2;
fw2 = fw2->next;

完整的代码请参考:

struct mynode{
    int data;
    struct mynode *next;
};

struct mynode *single_link_reverse(struct mynode *slink)
{
    struct mynode *cur;
    struct mynode *fw1;
    struct mynode *fw2;

    /* zero or one node*/
    if (NULL == slink || NULL == slink->next)
        return slink;

    cur = slink;
    fw1 = slink->next;
    fw2 = fw1->next;
    slink->next = NULL;

    /*two nodes*/
    if (NULL == fw2)
    {
        fw1->next = cur;
        return fw1;
    }

    /*three+ nodes*/
    while (NULL != fw2)
    {
        fw1->next = cur;
        cur = fw1;
        fw1 = fw2;
        fw2 = fw2->next;
    }

    /*now fw1 is the last node*/
    fw1->next = cur;
    return fw1;
}

sxg

 

阅读(3675) | 评论(11) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-03-11 18:46:07

三个指针,四步~

chinaunix网友2008-03-11 18:29:53

看来大家还是对数据结构和算法感兴趣呀,以后我得多写一些这方面的博文了hoho~ 其实我之所写这个“反转单链表”,其实是那天有朋友请教我的一个题目。我写的是罗嗦了点,不过是从遵循着考虑问题的思路来写的:一个节点,两个节点,三个节点,三个节点以上如何等等。一般人拿到这个题目应该都会遵循这样一个思路来写,没有几个人能一下子就写出二楼那样精炼的代码的;写出我写的那些代码之后,可以考虑优化,就能整得精炼些,漂亮些。这也正遵循了项目开发的规律,先实现基本功能,然后考虑优化,提升性能。

chinaunix网友2008-03-11 12:19:14

当初就该用双链表!

chinaunix网友2008-03-07 01:55:12

fera 我读你的算法觉得应该是:把当前节点的next指向上一个节点比较合适啊

cuichaox2008-02-28 21:59:33

头插法。