链表应用:快速删除与倒置
快速删除一个结点,常规删结点要找到前一个结点,如果给出这个结点的指针,可以采取拷贝下一个结点内容,释放下一个结点
单链表的倒序反转,只需将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);
}

浙公网安备 33010602011771号