单向链表的逆序操作

废话不多说,直接看代码

#include <stdio.h>
#include <stdlib.h>
#define  ElemType int

typedef struct node{
	ElemType data;
	struct node *next;
}node,*link;

void display(link list);

//使用头插法
link createH(link l){
	ElemType i;
	l->next=NULL;
	link p=NULL;
	while(1){
		/*p=(link)malloc(sizeof(node));
                if (NULL == p)
                {
                        printf("memory out of use/n");
                        return l;
                } */
		for(i=1;i<10;i++){
			p=(link)malloc(sizeof(node));
			p->data=i;
			p->next=l->next;
			l->next=p;
		}
		break;
		/*

		if(scanf("%d",&p->data)!=EOF){
			p->next=l->next;
			l->next=p;
		}else{
			break;
		}*/
	}
	return l;

}

link createF(link list){
        link p,k;
        list->next=NULL;
        int i;
        for(i=1;i<10;i++){
		k=list;
                p=(link)malloc(sizeof(node));
                p->data=i;
				while(k->next!=NULL){
					k=k->next;
				}
                p->next=NULL;
                k->next=p;
        }
        return list;
}

//方法一
link reverseA(link prev,link cur){
	link list=NULL;
	if(cur==NULL){
		return prev;
	}
	list=reverseA(cur,cur->next);
	cur->next=prev;
	return list;
}

//方法二
link reverseB(link p){
	if( p->next==NULL){
		return p;
	}
	link ph=reverseB(p->next);
	p->next->next=p;
	p->next=NULL;
	return ph;
}
//方法三
link reverseC(link l){
	link p=NULL,q=NULL;
	p=l->next;
	l->next=NULL;//头结点分离
	while(p!=NULL){
		q=p;
		p=p->next;
		q->next=l->next;
		l->next=q;
	}
	return l;
}
//方法四
link reverseD(link l){
	link p=NULL,q=NULL;
	if(l==NULL){
		return l;
	}

	p=l;
	q=p->next;
	if(q==NULL){
		return p;
	}else{
		l=reverseR(q);
	}

	q->next=p;
	p->next=NULL;	

	return l;
}

void display(link list){
	link p=list;
	while(p!=NULL){
		printf("%4d",p->data);
		p=p->next;
	}
	printf("\n");
}

void main(){
	link list,p,r;
	list=(link)malloc(sizeof(node));
	p=(link)malloc(sizeof(node));
	r=(link)malloc(sizeof(node));
	p=createF(list);
	display(p);
	r=reverseA(NULL,p);
	display(r);
	r=reverseB(p);
	display(r);
}

当然,还有其他方法,我会陆续添加

时间: 2024-10-16 03:46:42

单向链表的逆序操作的相关文章

java版的单向链表的逆序输出

将单向链表逆序输出,方法有三种: a.遍历链表,将每个节点的内容存入一个数组中,然后逆序输出数组(最简单的做法) b.使用栈来逆序输出 c.直接将链表逆序然后输出(本文采用的方法) 先介绍算法: 1). 若链表为空或只有一个元素,则直接返回: 2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继: 3). 重复2),直到q为空 4). 调整链表头和链表尾 示例:以逆序A->B->C->D为例,图示如下 package com.moluo.shujujiegou;

单链表逆序操作

//逆序操作//算法1:从第二个节点开始,记录它的下一个节点,然后依次挪到第一个节点之前成为新表头int inverse_node(struct node pH){struct node p = pH; //头结点struct node pPrev = NULL; //记录前一个节点struct node pBack = NULL; //记录下一个节点地址struct node *pFirstNode = p->pNext; //记录第一个节点 //节点只有1个或者无有效节点时,返回原来的链表,

C语言实现链表的逆序打印

我在前面几篇博客中<C语言实现链表节点的插入><C语言实现链表节点的删除><C实现头插法和尾插法来构建链表><C语言实现链表的基本操作>实现了链表的很多增删改查操作.这里我们要来实现链表的逆序打印,使用C来实现.代码上传至 https://github.com/chenyufeng1991/ReverseLinkedList . 基本算法是: (1)使用尾插法构建原链表: (2)依次遍历原链表: (3)取出遍历中的节点使用头插法建立一个新链表: (4)打印逆

只使用递归实现栈的逆序操作

2017-06-23 20:36:02 刚开始思考这个问题的时候陷入了一个误区,就是以为只能用一个递归完成. 然而事实上,可以使用两个递归来完成这个功能. 具体思考是这样的,首先递归其实是将问题规模缩小了,每次处理更小的问题.针对这题来说,更小的问题应该是去除底部那个数后的逆序再加上最后的数. 当然,你可能会问,什么不是去掉最上面的数,然后将它再放到最前面,理由很简单,栈是一种后进先出的数据结构,这种类型的数据结构适合的是在尾部添加数据,而非在首部添加数据,所以更清晰的或者说更适合栈的操作是先把

JAVA链表实现与链表的逆序

1.链表         链表有单链表还有双向链表,在java中每个节点都是一个类,这里声明了内部类,为了方便插入和删除,有时会在,链表的表头加上哨兵(形成有哨兵的循环或双向循环链表),这样的插入删除就不用考虑当插入删除的元素在边界的情况,方便,至于哨兵你可能觉得没什么用,其实他可以存储链表的许多信息,比如你每次查找一个元素,在无哨兵时,使用P!=null,使用哨兵,可以存储要查找的元素,退出时,就要判断是不是哨兵. 2.链表的实现与逆序 若想代码写得快,必须清楚每次交换插入,产生的状态和性质.

java 实现单链表的逆序

</pre><pre name="code" class="java">package com.ckw.mianshi; /** * java 实现单链表的逆序 * @author Administrator * */ public class SingleLinkedReverse { class Node{ int data; Node next; public Node(int data){ this.data = data; } }

单向链表的逆置

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct list LIST; struct list { int data; struct list *next; }; void print_list(struct list *p) { struct list *head = p; while (head) { printf("data = %d\n", he

如何实现链表的逆序

1 单向链表的反转 问题描述: 给定一个带头结点的单链表,请将其逆序.即如果单链表原来为head -->1 --> 2 --> 3 --> 4 --> 5,那么逆序后变为head --> 5 --> 4 --> 3 --> 2 --> 1. 解决过程: 给定一个单向链表1-->2-->3,通过下面的示意图,看如何一步一步的将单向列表反转. 代码实现: 1 class Node(object): 2 def __init__(self,

hdu 2419 逆序操作+并查集

此题关键在于维护点的连通性以及连通块的信息,容易想到并查集,但是并查集却不支持删边操作,于是考虑逆序处理,这样删边就变成了加边操作,每一个连通块的信息可以用stl中的multiset来维护,注意集合合并的时候要启发式合并(这里是按照集合的大小来合并,每次小的集合合并到大的集合里),不然会超时. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <set> 5 u