链表的插入删除主要是要考虑如果为空表,删除第一个等特殊情况,考虑全面。
具体实现如下
#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;
}