链表应用:快速删除与倒置

快速删除一个结点,常规删结点要找到前一个结点,如果给出这个结点的指针,可以采取拷贝下一个结点内容,释放下一个结点
单链表的倒序反转,只需将p指向的结点不断挂到头结点,将p不断向下移动即可

#include <stdio.h>
#include<stdlib.h>

typedef struct Node
{
	int Data;
	struct Node* PNext;
}Node;
typedef Node* PNode;
int CountNum;

void CreateNode(PNode* List)//创建一个链表,且赋值从0开始
{
	Node* NewNode = (Node*)malloc(sizeof(Node));
	if (!NewNode) exit(1);
	NewNode->PNext = NULL;
	NewNode->Data = CountNum++;
	(*List)->PNext = NewNode;
	*List = NewNode;
}
//快速删除一个结点,给出要删除的结点的指针,把后一个结点数据拷贝到这个结点,释放后一个结点
//时间复杂度为O(0) 但无法删除最后一个结点,无法修改倒数第二个PNext使得链表无法终止
void QuickDelete(PNode TrvP, PNode DeleNode)
{
	PNode Next=(DeleNode)->PNext;
	if (Next)
	{
		(DeleNode)->Data = Next->Data;
		(DeleNode)->PNext = Next->PNext;
		free(Next);
	}
	else
	{
		printf("ERROR");
		exit(1);
	}
}
//单链表的倒序反转,只需将p指向的结点不断挂到头结点指向的PNext,将p不断向下移动即可
void ReverseNode(PNode HNode)
{
	PNode p = HNode->PNext;
	HNode->PNext = NULL;
	PNode temp;
	while (p)
	{
		temp = p;
		p = p->PNext;
		temp->PNext = HNode->PNext;
		HNode->PNext = temp;
	}
}
int main()
{
	PNode HNode;
	HNode = (PNode)malloc(sizeof(Node));
	HNode->PNext = NULL;
	PNode List = HNode;
	for (int i = 0; i < 5;i++) CreateNode(&List);
	PNode DeleNode = List;
	for (int i = 0; i < 5; i++) CreateNode(&List);
	QuickDelete(HNode, DeleNode);
	ReverseNode(HNode);
	for (PNode P = HNode->PNext; P; P = P->PNext) printf("%d\n", P->Data);
}
posted @ 2021-03-15 23:04  empty_thought  阅读(98)  评论(0)    收藏  举报