单链表逆序
2012-03-06 21:15
218 查看
#include <stdio.h> #include <stdlib.h> typedef struct student { int number; char name[20]; int score; struct student *next; }student;typedef struct list { int a; struct list *next; }List,*LIST; List *createList (); void paixu(LIST L);//比较笨拙的一种方法 List *reverse(LIST L); int main() { LIST p; List *q; int i=0; p = createList(); q = p->next; //printf("output all element.\n"); while(q!=NULL) { ++i; printf("%d \n",q->a); q = q->next; } //paixu(p); reverse(p); q = p->next; printf("排序结果:\n"); while(q!=NULL) { ++i; printf("%d \n",q->a); q = q->next; } } List *createList () { LIST ph; List * p ,*q; int element; //create the head of the list; ph = (List *)malloc(sizeof(List)); ph->a = 0; ph->next = NULL; q = ph; printf("Please input the elemnet:\n"); scanf("%d",&element); while(element != 99999)//如果输入的值为99999,则表示输入结束,此处有待改进 { p = (List *)malloc(sizeof(List)); p->a = element; q->next = p ; q = p; scanf("%d",&element); } p->next = NULL; return ph; } void paixu(LIST L) { int len = 1 ; int i=0,j=0; List * p=L->next; List *q=p; int temp; while(p->next != NULL) { p = p->next; len++; } p = q; printf("\nLEN = %d\n",len); for(;i<len/2;++i) { j = i; for(;j+i != len-1;j++) { q=q->next; } temp = p->a; p->a = q->a; q->a = temp; p = p->next; q = p; } } List *reverse(LIST L) { List *p1,*p2,*p3; if(L == NULL ||L->next == NULL) return L; p1=L->next; //p1指向链表头节点的下一个节点 p2=p1->next; p1->next=NULL; while(p2) { p3=p2->next; p2->next = p1; p1=p2; p2=p3; } //printf("p1 = %d,next = %d\n ",p1->number,p1->next->number); L->next=p1; //将链表头节点指向p1 return L; }
List *reverse(LIST L)分析:
假设需要逆序的单链表为:
则逆序以后的链表为:
过程:
(1)取p1指向header->next
p1=stu->next;
p2保留p1->next p2=p1->next;
将p1->next置为NULL,因为单链表逆序以后,当前的p1节点为尾节点 p1->next=NULL;
(2)取p3保留p2->next p3=p2->next;
将p2插入p1之前 p2->next
= p1;
p1指向p2指向的节点 p1=p2;
p2指向p3指向的节点 p2=p3;
循环一次修改以后的单链表如下:
(3)重复步骤(2)
循环一次修改以后的单链表如下:
(4)将header->next指向p1,完成整个单链表的逆序
相关文章推荐
- 链表逆序
- 链表B 逆序建立链表
- leetcode | 单链表逆序 Reverse Linked List
- C 带头节点单链表逆序
- 单链表逆序
- c语言链表逆序的问题
- 链表的k值逆序
- 日常联系:一个C++程序完成链表的增加结点、删除结点、打印、查询、逆序等操作
- 单链表中一些经典的问题-->约瑟夫环,链表逆序,查找链表结点...(上)
- python实现链表逆序(反转函数)
- 逆序建链表
- 【每日算法】归并排序及其应用(逆序对&合并有序链表)
- 单链表逆序生成及逆置的完整实现
- 链表逆序
- 逆序链表的C程序
- 数据结构之链表:实现单链表的逆序 (1)
- 链表面试题逆序打印,删除无头非尾节点,非头位置插入,约瑟夫环,查找中间和倒数第k个节点
- C/C++面试之算法系列--典型的几个链表操作-逆序和重排
- 【数据结构】递归实现链表逆序
- 链表逆序