数据结构—头插法逆转单链表——空间复杂度为O(1)

#if 1
#include<stdio.h>
#include<stdlib.h>
#include<iostream>

using namespace std;

struct Node
{
	int data;
	Node *next;
};

//初始化
Node *init()
{
	Node *head=new Node;
	head->next=NULL;
	return head;
}

//头插法创建节点
void insetList(Node *head,int i)
{
	Node *cur=new Node;

	cur->data=i;

	cur->next=head->next;
	head->next=cur;
}

//链表A生成
void CreateList(Node *head_A)
{
	for(int i=-8;i<10;i++)
	{

		insetList(head_A,++i);
	}
}

//打印链表
void print(Node *head)
{
	Node *temp=head->next;	//防止头指针移动
	while(temp)
	{
		cout<<temp->data<<"  ";
		temp=temp->next;

	}
}

//拆分链表A,链表C源于A。生成链表B
void ReversalList(Node *head_A,Node *List_C)
{
	Node *pa=head_A->next;	//pa指向链表A的首元节点,作为逆转尾节点,可以省略pa

	Node *pb=pa->next;		//pb指针指向pa后继节点,为移动指针

	pa->next=NULL;			//此处---首元节点置空

	Node *pc=pb;			//pc存放pb后继节点,为移动指针

	while(pb)		//!!!退出条件为最后一个节点头插入第一个节点,在插入之前将NULL给了pc,然后改变pb的指针域
	{
			pc=pb->next;  //pc指向pb后继

			pb->next=head_A->next;	//pb作为新节点用头插法插入首元节点之前

			head_A->next=pb;		//头节点指向新插入的pb节点

			pb=pc;					//pb指向原来pb节点的后继开始循环

	}

}
void main()
{
	Node *head_A=init();	//链表A初始化头节点

	//链表C初始化,结构体指针记得初始化头节点
	Node *List_C=head_A;	//

	//创建链表A
   CreateList(head_A);

   //打印链表A
   cout<<"链表A为:"<<endl;
   print(head_A);
   cout<<endl;

   //调用函数逆转链表A
   ReversalList(head_A,List_C);

    //打印链表C
   cout<<endl<<"逆转链表List_C为:"<<endl;
   print(List_C);
   cout<<endl;

   system("pause");

}
#endif

/*
总结:
循环退出条件为最后一个节点头插入第一个节点,在插入之前将尾节点NULL给了pc,pc再给pb,然后改变pb的指针域;
头指针head是作为头插法不能改变的指针,可以设一个临时结构体指针指向源链表首元节点(pa),也可以省略;
头插法的新节点为pb,pb将下一个节点的地址交给pc后,pb相当于一个独立节点,由于循环机制,在插入后需要重置pb指针位置;
该算法共新建三个指针,其中两个为移动指针;
*/

  

原文地址:https://www.cnblogs.com/huxiaobai/p/10541400.html

时间: 2024-10-13 06:59:27

数据结构—头插法逆转单链表——空间复杂度为O(1)的相关文章

C++练习 | 不使用头插法逆转单链表

void D(PBook pHead) { PBook p,q,s; p=pHead->next->next; q=p->next; s=q->next; pHead->next->next=NULL; p->next=pHead->next; q->next=p; p=q; q=s; while(q->next!=NULL) { s=q->next; q->next=p; p=q; q=s; } q->next=p; pHea

博客第二天——头插法建立单链表

今天是第二天,今天遇到一个题:本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 首先考虑这个题目本身不难,鉴于本人刚学习数据结构,题目中已给代码的单链表的创建值得我考虑.题目中给的是头插法代码如下:分析一下这段代码 int N, i; List L, p; scanf("%d", &N); L = NULL; for ( i=0; i<N; i++ ) { p = (List)malloc(sizeof(struct

头插法建立单链表

#include<stdio.h>#include<stdlib.h> typedef struct node{ int data; struct node *next;}LNode,*LinkList; LinkList creat_list(){ LinkList head=NULL; head=(LinkList)malloc(sizeof(LNode)); if(head==NULL) { printf("memory out of use\n"); r

C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)

1题目 实现两个链表的合并 2基本功能要求: 1.建立两个链表A和B,链表元素个数分别为m和n个. 2.假设元素分别为(x1,x2,-xm),和(y1,y2, -yn).把它们合并成一个线性表C,使得: 当m>=n时,C=x1,y1,x2,y2,-xn,yn,-,xm 当n>m时,C=y1,x1,y2,x2,-ym,xm,-,yn 3.输出线性表C: 用直接插入排序法对C进行升序排序,生成链表D,并输出链表D. 3测试数据: (1)A表(30,41,15,12,56,80) B表(23,56,

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

数据结构之 线性表---单链表操作A (删除链表中的指定元素)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个). 输入 第一行输入元素个数n: 第二行输入n个整数. 输出 第一行输出初始链表元素个数: 第二行输出按照逆位序所建立的初始链表: 第三行输出删除重复元素后的单链表元素个数: 第四行输出删除重复元素后的单链表. 示例输入 10 21 30 14 55 32 63

Java数据结构-线性表之单链表LinkedList

线性表的链式存储结构,也称之为链式表,链表:链表的存储单元可以连续也可以不连续. 链表中的节点包含数据域和指针域,数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个头结点和头指针的区别: 头指针: 指向链表的第一个节点的指针,若链表有头结点,则是指向头结点的指针: 头指针具有标识作用,所以常用头指针作为链表的名字: 不论链表是否为空,头指针都不为空: 是链表的必要元素. 头结点: 头结点是为了操作的统一和方便而设立的,放在第一个元素节点的前面,其数据域一般无意

大话数据结构之php实现单链表

最近想起来两件事1.大话数据结构和大话设计模式 这两本书很有意思,C语言有指针,所以实现起来容易理解,所以突然想到用PHP写一下来熟悉一下数据结构的线性表,不过看的比较慢.一般两三天才看完一部分,毕竟还要工作,老板还安装摄像头看着每天干了啥.....老板事业兴隆,嘻嘻. 线性表的概念不赘述,直接去看大话数据结构,代码也是在参考众多实现方案,比较符合大话数据结构的原本思想,就是基本上还原C语言的实现过程. 直接上代码 线性表 <?php /*  *文件名:linearList.php   * 功能