Chinaunix首页 | 论坛 | 博客
  • 博客访问: 917287
  • 博文数量: 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

 

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

fera2008-02-28 12:52:12

sxg:这是n年前偶写的,不小心翻出来了。偶就是想说明一下,答案会有很多,但是思路可能只有一个。所以,就算简单也要列出思路,这样才不会掉入“想到哪写到哪”的怪圈里。 见笑!

chinaunix网友2008-02-28 09:24:14

fera写的除了用一个cur指针指向参数链表头,跟二楼是完全一样的哦 之所以简单,才没有解题思路;毕竟代码已经非常明白了呀

fera2008-02-27 13:13:45

H_List Reverse( H_List h_list ) { Node * temp = NULL, * prev = NULL, * cur = (Node *) h_list; while (cur) { temp = cur->next; cur->next = prev; prev = cur; cur = temp; } h_list = (H_List)prev; return h_list; }

fera2008-02-27 11:47:47

为啥大家都不写解题思路捏?——虽然这题很简单:将下一个结点的next指向本结点就OK了。

chinaunix网友2008-02-25 12:52:47

嘿嘿,数据结构放下老久了,见笑了哇 不过道理还是简单的,就是同时记住了三个节点,别掉链子了就成。 阁下写的的确很精炼,致敬~