c语言-C语言中单向的链表反转?

问题描述

C语言中单向的链表反转?

这段代码实在看不懂啊,求解

 Linklist *reverse(Linklist *head) //链表逆置
{
    Linklist *p,*t;
    p=head->next;
    t=p->next;
    p->next=NULL;
    while(t!=NULL)
    {
      p=t->next;
      t->next=head->next;
      head->next=t;
      t=p;
    }
    return head;
}

其中之一:while中第二句head->next就相当于P,那p=t->next;和t->next=head->next(P);有什么区别呢?

解决方案

原链表
Head ---->[next (first) ]---->[next ]---->[next ]---->[next ]---->[next ]---->[next(rear) ]---[NULL]

p=head->next;//第一个数据节点(first)

t=p->next;

p->next=NULL; 以后的链表 在此处断开,后面的头结点是 t
Head ---->[next ]-->【NULL】 。。。。。。 p 。。。。。 -->[next ]---->[next ]---->[next ]---->[next ]---->[next ]---[NULL]
p-->--^ 插入一个NULL节点表示结束 t--->--^

                循环中不断地从t 链表取下节点,插入Head 之后

                插入结束时
                Head->[next(rear)]-->[next(prev(rear)].....【next(first)】->[NULL]

解决方案二:

反转单向链表
反转单向链表
反转单向链表

解决方案三:

   p=t->next;///  取 t 的下一个节点,p接管t->next 这条链表,不使丢失,这样 头结点 t取下后,t->next 以及后面的各个节点,还能够找到
  t->next=head->next;///修改 t 的下个节点指向 head 的下个节点 t->next 接管了 head->next 保证 head->next 这条链不丢失。
  head->next=t;        ///头结点的next 指向t   head->next 设置为t 成功的在head后面插入节点t
  t=p;                      ///维持指针 t 作为尚未翻转部分的头结点指针

while中第二句head->next就相当于P,那p=t->next;和t->next=head->next(P);有什么区别呢?
完全不是这回事
p,t只是两个指针
只有指向链表中的节点的时候,才能代表节点。

外部三个语句的作用是断开链表,并分成 head,t两个单链表
内部语句的作用是取 t 链表的头结点,插入head链表中,
并临时用指针p接管 t链表的剩下部分,当节点t 插入head链表中的时候
恢复t作为未翻转部分头结点的地位
以便循环能够继续进行。

抱歉回复晚了

时间: 2024-11-03 05:15:57

c语言-C语言中单向的链表反转?的相关文章

c语言-C语言中单向的链表反转

问题描述 C语言中单向的链表反转 node* reverse1(node * head) { node*p,*q,*r; p = head; q = head->next; head->next = NULL; while(q){ r = q->next; q->next = p; p = q; q = r; } head=p; /* while(p) { printf("%d ",p->num); p=p->next; }*/ printf(&qu

编程c语言-vs2013中如何定义一个结构体该结构体定义一个结构体数组 结构体数组中包含一个链表

问题描述 vs2013中如何定义一个结构体该结构体定义一个结构体数组 结构体数组中包含一个链表 这样定义对么 编译时报错 缺少:在*前面 这是哪错了啊 请高手指点指点 解决方案 你把两个结构体的定义调换一下次序就没问题啦,要先声明或定义结构体:Station,才能使用 解决方案二: 因为struct Station是在struct Train结构体之后才定义的,所以你要在这之前先声明一下struct Train 解决方案三: 做一个前向声明,或者调换两个结构位置都可以. 解决方案四: 结构体数组

修改内容-C语言修改文件中某一行

问题描述 C语言修改文件中某一行 RT,在vc2010下,做的学生管理系统.没有采用链表. 已经找到所要修改的行,并且修改成功,在内存中已经看到修改后的结果,并用fflush写回文件. 但是文件就是没有改变,上代码,求帮助,已经卡在这一天半了. #include"head_1.h" void change_stu(int id,char name[20],float score) { FILE *fp2; char str[20]; char a[20]; int ch2; int i

图节点删除-C语言 删除图中制定的节点

问题描述 C语言 删除图中制定的节点 /*/////////////////////////////////////////////////////////////*/ /* 图的深度优先遍历 / //////////////////////////////////////////////////////////////*/ #include #include struct node /* 图顶点结构定义 / { int vertex; / 顶点数据信息 / struct node *nextn

指针-C语言 多项式加法中的问题

问题描述 C语言 多项式加法中的问题 不知道结果为什么出错,怎么也找不出来 #include #include struct PolyNode{ int coef; //系数 int expon; //指数 struct PolyNode *link;//指向下一个节点的指针 }; typedef struct PolyNode *Polynomial; Polynomial P1, P2, P3, P4,P5; void Attach(int c, int e, Polynomial *pRe

c语言编程-如何用C语言实现linux中的ll命令?

问题描述 如何用C语言实现linux中的ll命令? 如何用C语言实现linux中的ll命令?大师能给个完整的代码吗?最好有些注释.(我C语言学的不怎么好,害怕看不懂.) 解决方案 C语言实现的linux下ls命令linux "ll" 命令实现在Linux中, 用C语言简单实现chmod命令 解决方案二: 获取文件属性:http://www.cnblogs.com/hnrainll/archive/2011/05/11/2043361.html 遍历文件夹:http://blog.csd

android-java语言 安卓开发中的问题

问题描述 java语言 安卓开发中的问题 Pattern ptn=Pattern.compile("[(d{2}:d{2}.d{2})]"): Matcher mtn=ptn.matcher(line): 这两句是什么意思? 解决方案 正则表达式,匹配 [11:22.33]这样的字符串,d{2}表示2位数字. 解决方案二: Java语言是一种支持多线程的语言,它通过同步(互斥)和协作(等待和唤醒)来完成.这里聊聊同步. ? 线程不安全主要来自于类变量(静态变量)和实例变量,前者位于方法

c语言问题-c语言 fun函数中的for语句中的小*为啥不能输出如何解决

问题描述 c语言 fun函数中的for语句中的小*为啥不能输出如何解决 #include void fun(char a) { int n=0,i=0; char *p=a; while(*p=='') { p++; n++; } while(*p!='/0') { a[i++]=*p; p++; } for(;n>0;n--) { a[i++]='*'; } a[i]=0; } main() {char s[81]; int n=0; void NONO (); printf("Ente

c语言-C语言在函数中调用指数组的问题

问题描述 C语言在函数中调用指数组的问题 #include <stdio.h> int i=5; void output_array ( int array[] ){ int a; for ( a=0; a<i; a++ ){ printf ( "%i%s", &array[a], "t" ); //warning: format specifies type 'int' but the argument has type 'int *'