链表插入删除反转打印

链表的插入删除主要是要考虑如果为空表,删除第一个等特殊情况,考虑全面。
具体实现如下

#include<stdlib.h>
#include<stdio.h>
struct Node {
	int data;
	struct Node* next;
};
struct Node* head;

//通过迭代反转
void Reverse()
{
	struct Node* cur = head;
	struct Node* pre = NULL;//第一个结点的pre为NULL
	struct Node* next = cur->next;
	while(cur!=NULL)
	{
		next = cur->next;//指向前一个的时候先保存当前结点的next位置
		cur->next = pre;//指向前一个
		pre = cur;//准备下一个的pre
		cur = next;
	}
	head = pre;
}
//编写完成后考虑空表和只有一个结点的特殊情况

//Recursion
//通过递归来打印链表 Print linked list using recursion
void Print(struct Node*p)
{
	if (p == NULL)
		return;
	printf("%d ",p->data);//如果翻转顺序打印那么只需要调换该行与下一行的位置
	Print(p->next);
}

//通过递归反转打印链表,链表本身并没有被反转
void ReversePrint(struct Node* p)//
{
	if (p == NULL)
	{
		printf("\nReversePrint:");
		return;
	}
	ReversePrint(p->next);
	printf("%d ", p->data);
}

//通过递归来反转链表
//自己编写的
struct Node* Reverse_recursion(struct Node*p)
{
	if (p->next == NULL)
	{
		head = p;
		return p;//到达最后一个结点
	}
	Reverse_recursion(p->next)->next = p;
	//当前p的下一个结点指向p
	p->next = NULL;
	//确保反转后的最后一个结点指向空
	return p;
}
//课程中
void Reverse2(struct Node* p)
{
	if (p->next == NULL)
	{
		head = p;
		return;
	}
	Reverse2(p->next);
	struct Node* q = p->next;
	//找到当前结点的下一个结点(反转前)
	q->next = p;
	//以上两行可以合并为下面这一行
	// p->next->next=p;
	p->next = NULL;
}
void print()
{
	struct Node* temp = head;
	printf("list is:");
	while (temp != NULL)//遍历操作
	{
		printf(" %d", temp->data);
		temp = temp->next;

	}
	printf("\n");
}
void Insert(int data, int n)
{
	//先创建该结点
	struct Node* temp1 = (struct Node*)malloc(sizeof(struct Node));
	temp1->data = data;
	temp1->next = NULL;
	if (n == 1)//如果插在第一个位置
	{
		temp1->next = head;//空表也可以
		head = temp1;
		return;
	}
	//找到要插入位置的前一个
	struct Node* temp2 = head;
	for (int i = 0; i < n - 2; i++)//移动n-2次
	{
		temp2 = temp2->next;
	}
	//把temp2的位置移到第n-1个位置
	temp1->next = temp2->next;
	temp2->next = temp1;
	return;
}
//delete node
//注意如果想删除的结点位于头结点
//删除后要释放空间
void Delete(int n)//删除第n个位置
{
	struct Node* temp1 = head;
	// if the previous node does not exist
	if (n == 1)
	{
		head = head->next;
		free(temp1);
		return;
	}
	// if the previous node  exists
	for (int i = 0; i < n - 2; i++)//移动n-2次
	{
		temp1 = temp1->next;//temp1 points to(n-1)th Node
	}
	struct Node* temp2 = temp1->next;//准备删除的结点
	temp1->next = temp2->next;
	free(temp2);
}
int main()
{
	head = NULL;//初始化空表
	Insert(2, 1);
	Insert(3, 1);
	Insert(4, 3);
	print();//list is: 3 2 4

	Delete(1);
	print();//list is: 2 4
	Delete(2);
	print();//list is: 2 
	Insert(9, 1);
	Insert(3, 1);
	Insert(4, 3);
	print();//list is: 3 9 4 2
	Reverse();
	print();//list is: 2 4 9 3
	Print(head);// 2 4 9 3
	ReversePrint(head);//ReversePrint:3 9 4 2
	print();// list is: 2 4 9 3
	Reverse_recursion(head);
	print(); //list is : 3 9 4 2
	Reverse_recursion(head);
	print();//list is : 2 4 9 3
	return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值