| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1335 人关注过本帖
标题:求单链表就地逆置【高效】算法
只看楼主 加入收藏
lmx07
Rank: 1
等 级:新手上路
帖 子:20
专家分:1
注 册:2009-6-3
结帖率:66.67%
收藏
已结贴  问题点数:5 回复次数:4 
求单链表就地逆置【高效】算法
RT
本人刚学数据结构,忘大虾不吝赐教。
搜索更多相关主题的帖子: 算法 单链 
2010-03-23 20:43
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
带头结点吗?
2010-03-23 22:15
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:1 
2010-03-23 22:21
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:4 
生成头结点的时候 是用了前面插入的 方法
所以在输出的时候 是逆序输出 就地逆置 后 刚好 和输入时 相同

只做了 两个 或两个以上的结点可以运行  如果是一个结点的
就 自己在函数里面加一条 判断语句 if(rear) return;
就可以了
#include <stdio.h>
#include <stdlib.h>

#define LEN sizeof(struct LNode)

typedef struct LNode
{
    int  data;
    struct LNode *next;
}*LinkList;

//创建一个带头结点的单链表
void Creat_List( LinkList &L, int n )
{
    LinkList pf;
    int i;

    L = ( LinkList ) malloc ( LEN );
    if( L == NULL )
    {
        printf("ERROR!\n");
        return;
    }
    L->next = NULL;
    for( i = 0; i<n; i++ )
    {
        pf = ( LinkList ) malloc ( LEN );
        scanf("%d", &pf->data);
        pf->next = L->next;
        L->next = pf;
    }
}

//输出   带头结点的链表
void Output_List( LinkList &L )
{
    LinkList pb;
    pb = L->next;

    while( pb )
    {
        printf("%d ",pb->data);
        pb = pb->next;
    }
    printf("\n");
}

// 就地逆置 带头结点
void  Backwards_List( LinkList &L )
{
    //方法:第一个结点指向NULL
    //第二个结点指向第一个 第三个指向第二个
    // 可以看成是 只改变了 结点的 指向 而没有改变 位置

    LinkList  pa, rear, y;

    pa = L->next;
    rear = pa->next;
                   if( rear )return ;
    pa->next = NULL;
    y = rear->next;
    rear->next = pa;
    pa = rear;
    rear = y;

    while( rear->next )
    {
        y = rear->next;
        rear->next = pa;
        pa = rear;
        rear = y;
    }
    rear->next = pa;
    L->next = rear;
}

void main()
{
    LinkList L;
    int n;

    printf("输入链表 L 结点的个数:");
    scanf("%d", &n);
    printf("\n");

    printf("输入结点元素:");
    Creat_List( L, n);

    printf("输出排序前的 L 链表:");
    Output_List( L );
    printf("\n");

    Backwards_List( L );
    printf("输出逆置后的 L 链表:");
    Output_List( L );
    printf("\n");
}
2010-03-24 07:49
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
不带 头结点的
void  Backwards_List( LinkList &p )
{
    //方法:第一个结点指向NULL
    //第二个结点指向第一个 第三个指向第二个
    // 可以看成是 只改变了 结点的 指向 而没有改变 位置
    LinkList  pa, rear, y;

    pa = p;
    rear = pa->next;
                   if( rear )return ;
    pa->next = NULL;
    y = rear->next;
    rear->next = pa;
    pa = rear;
    rear = y;

    while( rear->next )
    {
        y = rear->next;
        rear->next = pa;
        pa = rear;
        rear = y;
    }
    rear->next = pa;
}
2010-03-24 07:53
快速回复:求单链表就地逆置【高效】算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018309 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved