注册 登录
编程论坛 闲聊灌水

折腾到现在,快1点了

令狐少侠56 发布于 2015-09-29 00:57, 730 次点击
今天想写个原地反转链表的代码,想了三种方法,先试写第一种。
head ABCD NULL先变为head BCDA NULL再变为head CDBA NULL。。。。。如此变换
花了很长时间不过我觉得值了,以后得先思考所用的方法需要那些变量而不是盲目的敲代码。

当然for语句中的for敲成了while,找错找了好长时间,这个时间花的不值。
14 回复
#2
林月儿2015-09-29 07:12
以下是引用令狐少侠56在2015-9-29 00:57:04的发言:

今天想写个原地反转链表的代码,想了三种方法,先试写第一种。
head ABCD NULL先变为head BCDA NULL再变为head CDBA NULL。。。。。如此变换
花了很长时间不过我觉得值了,以后得先思考所用的方法需要那些变量而不是盲目的敲代码。

当然for语句中的for敲成了while,找错找了好长时间,这个时间花的不值。


怎么感觉这样变运行效果达不到,多余操作也很多
#3
hu9jj2015-09-29 07:50
应该是快8点了
#4
TonyDeng2015-09-29 21:27
小胡說,不要瞎折騰。該睡就睡,睡醒了啊哈靈機一動,問題自然解決。
#5
令狐少侠562015-09-29 21:47
回复 2楼 林月儿
写起来是比较烦。
程序代码:
#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node *next;
};
typedef struct node lnode;
typedef struct node *list;


list creat()
{
    int N;
    int i,a;

    list tempnode,q;
    list head;

    printf("请输入链表结点个数\n");
    scanf("%d",&N);
   
    head=NULL;

    printf("请输入数据\n");

    for(i=1;i<=N;i++)    //尾插法建立单链表,无表头
    {
        tempnode=(list)malloc( sizeof(lnode) );
        tempnode->next=NULL;
        scanf("%d", &a);
        tempnode->data=a;
        

        if(head==NULL)
            head=tempnode;
        else
            q->next=tempnode;

            q=tempnode;
    }   

    return head;
}



list reverse(list head)//原地反转
{

        list tailnode,p,q;
        tailnode=head;
        p=head;
        q=NULL;

        while(tailnode->next!=NULL)  tailnode=tailnode->next;//找到链表尾结点

        while(p!=tailnode)
        {
            head=p->next;//记住p->next所指向的位置
            
            //未反转的链表第一个结点插入到已反转链表的第一个位置
            tailnode->next=p;
            if(q==NULL) p->next=NULL;
            else p->next=q;

            q=p;//记住已反转链表的第一个结点

            p=head;

        }
        return head;

}


void output(list head)
{   
    list p;
    p=head;
    while(p!=NULL)
    {
        printf("%d\t",p->data);
        p=p->next;
    }
    printf("\n");
}


int main()
{
    list list_1,list_reverse;

    list_1=creat();
    output(list_1);

    list_reverse = reverse( list_1 );

   
    output(list_reverse);

    return 0;

}
#6
令狐少侠562015-09-29 21:48
回复 4楼 TonyDeng
。。。下次不这样了。。。
#7
令狐少侠562015-09-29 21:48
回复 3楼 hu9jj
努力成为优秀的程序员。。。。
#8
TonyDeng2015-09-29 22:01
有時是需要主動睡覺的。我說“睡覺”的意思,是主動放鬆,把注意力從編程上引開,起來泡壺茶喝,出去走走,做點別的事,然後回來,往往之前死啃不下的,很自然地打通了。編程是藝術,不靠死啃的,也沒有包打天下的萬金油技能,更沒有屠龍術,靈動更重要!
#9
冰镇柠檬汁儿2015-09-30 14:56
p=p->next;
这是个啥意思来着
#10
冰镇柠檬汁儿2015-09-30 15:01
链表,很久不用的东西了,我要是写这个程序,肯定很偷懒,先把链表转化成数组,然后用reverse函数倒叙一下,然后再把数组转化成链表
#11
TonyDeng2015-09-30 15:07
以下是引用冰镇柠檬汁儿在2015-9-30 15:01:17的发言:

链表,很久不用的东西了,我要是写这个程序,肯定很偷懒,先把链表转化成数组,然后用reverse函数倒叙一下,然后再把数组转化成链表

這樣就繞了一個圈了,再想想,嘻嘻
#12
TonyDeng2015-09-30 15:16
長時間折騰搞不出來,無非仍然是不肯寫直接代碼的緣故,要玩技巧,省這省那,結果是增加了代碼的複雜性又不能達到目的。
#13
TonyDeng2015-10-01 19:21
先遍歷一次鏈表,把每個結點的地址按順序存入一個臨時數組中,然後按這個數組反向構建一個新的鏈表即可。這樣數據是不會挪動的,省去複製大數據的開銷,特別是有些結點是對象不能輕易複製的,開銷祗是構建一個臨時數組,所做的動作,則是指針値置換,等於掃描鏈表兩次的時間。

[ 本帖最后由 TonyDeng 于 2015-10-1 19:24 编辑 ]
#14
醒山2015-10-02 16:42
以下是引用冰镇柠檬汁儿在2015-9-30 14:56:04的发言:

p=p->next;
这是个啥意思来着

这个意思是指向下一个节点,冰镇柠檬汁儿姐好久不见
#15
令狐少侠562015-10-03 14:22
回复 10楼 冰镇柠檬汁儿
确实有人这么干。。。
1