| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1003 人关注过本帖
标题:单链表的就地逆序
只看楼主 加入收藏
剑飘香
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2011-9-8
结帖率:0
收藏
 问题点数:0 回复次数:13 
单链表的就地逆序
题目要求将单链表就地逆序
个人认为就地逆序应该是将单链表的指针向前移两位,使之指向前一个节点,那么就必须从最后一个指针Null开始,不然就会有数据被覆盖而丢失,但我觉得这样子程序的复杂度会增加很多,所以求高手帮忙提供一种思路能够巧妙地解决这一问题
搜索更多相关主题的帖子: 子程序 
2011-09-12 23:39
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:0 
建个全局变量 int total 每新建一个链表进行total自加,把自加的值赋给链表中储存这个的变量
有多少个链表total的值就是多少,而且每个链表从小到大都标好了,有了这个变量接着在逆序就简单了吧?



纯属瞎瓣

都不结贴我郁闷那!
2011-09-13 01:12
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>

typedef struct node{
    int element;
    struct node * next;
}Node,* List;

void CreateList(List &L)
{
    Node * p;
    L=(List)malloc(sizeof(Node));
    L->next=NULL;   
    for(int i=0;i<5;i++)
    {
        p=(Node *)malloc(sizeof(Node));
        p->element=i;
        p->next=L->next;
        L->next=p;
    }
}
void PrintList(List L)
{
    Node *p=L->next;
    while(p)
    {
        printf("%d ",p->element);
        p=p->next;
    }
    printf("\n");
}

void ReverseList(List &L)
{
    Node *p,*q;
    p=L->next;
    q=p->next;

    while(p&&q)
    {
        p->next=q->next;
        q->next=L->next;
        L->next=q;
        q=p->next;
    }  
}
int main()
{
    List A;
    CreateList(A);
    PrintList(A);
    ReverseList(A);
    PrintList(A);
    return 1;
}
简单写了一个逆序函数,顺带测试代码一起写了。不知道符不符合你的意思。

很久没有用过单链表了,生疏了
2011-09-13 01:51
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9026
专家分:54030
注 册:2011-1-18
收藏
得分:0 
void reverse( Node*& p )
{
    Node* t = 0;
    for( ; p ; )
    {
        Node* _t = t;
        t = p;
        p = p->next;
        t->next = _t;
    }
    p = t;
}
2011-09-13 08:17
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:0 
直接对称交换数据不就行了
2011-09-13 09:01
剑飘香
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2011-9-8
收藏
得分:0 
回复 3楼 czsbc
我自己想了一个逆序的方法,模型是引用你的程序,但是运行时说内存冲突,不知道怎么回事,麻烦帮忙看看
#include<stdio.h>
#include<stdlib.h>

typedef struct node{
    int element;
    struct node * next;
}Node,* List;

void CreateList(List &L)
{
    Node * p;
    L=(List)malloc(sizeof(Node));
    L->next=NULL;   
    for(int i=0;i<5;i++)
    {
        p=(Node *)malloc(sizeof(Node));
        p->element=i;
        p->next=L->next;
        L->next=p;
    }
}
void PrintList(List L)
{
    Node *p=L->next;
    while(p)
    {
        printf("%d ",p->element);
        p=p->next;
    }
    printf("\n");
}

void ReverseList(List &L)
{
    Node *p,*q;
    p=L->next;
    q=p;
    while(p&&q){
        L->next=p->next;
        p->next=p->next->next;
        L->next->next=q;
        q=L->next;
        p=p->next;
    }
}
int main()
{
    List A;
    CreateList(A);
    PrintList(A);
    ReverseList(A);
    PrintList(A);
    return 1;
}
2011-09-13 19:51
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我看 4楼 说的最言简意赅。

head -> a -> b -> c -> null
只要变成
null <- a <- b <- c <- head
就行了,说白了只要让指针反过来就行。

有一点要注意的是,如果先让 b 的指针指向 a 的话,c 的地址就找不找了,所以要用一个辅助指针先记住 c 的位置。

2011-09-13 20:56
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
回复 4楼 rjsp
看过rjsp写的很多代码,变量的命名都喜欢在前面加个_,像Node* _t这样,不是说这种命名方法一般是给系统用的吗,这样写只是个人爱好,还是有什么端倪啊
2011-09-14 19:45
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 8楼 specilize
有经验了就可以用这种名字。给变量起名没有什么绝对的规则,但要用心起,起“漂亮”一些。
平价一个人写的代码经常不是从算法角度下手的,而是其它方面。其中主要是看一个程序员的素养和经验。

平时写阅读高质量代码的时候可以多留心记点东西。读得久了,好多东西就熏陶出来。
2011-09-14 21:35
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
回复 9楼 pangding
有经验就可以用这种命名的意思是不是有了可以防止命名与系统命名相冲突的经验,按版主的意思,好像是说在某些情况下采用这种编程风格更好,那么什么情况下会考虑这种命名方式呢
2011-09-15 13:07
快速回复:单链表的就地逆序
数据加载中...
 
   



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

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