插入,删除,反转
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
}Node, *LinkedList;
//插入方法
LinkedList insert(LinkedList head, Node *node, int index) {
if (head == NULL) {
if (index != 0) {
return head;
}
head = node;
return head;
}
if (index == 0) {
node->next = head;
head = node;
return head;
}
Node *current_node = head;
int count = 0;
while (current_node->next != NULL && count < index - 1) {//双重保证 避免了index超出范围
current_node = current_node->next;
count++;
}
if (count == index - 1) {//确保能到了指定结点前一个结点
node->next = current_node->next;
current_node->next = node;
}
return head;
}
//删除结点
LinkedList delete_node(LinkedList head, int index) {
//1如果头结点为空的话
if (head == NULL) {
return head;
}
//2如果删除头结点
if (index == 0) {
head = head->next;
return head;
}
//其他情况
Node *current_node = head;
int count = 0;
while (current_node->next != NULL && count < index - 1) {
current_node = current_node->next;
count++;
}
if (count == index - 1) {//记得释放删除结点的内存
Node *delete_node = current_node->next;
current_node->next = delete_node->next;
free(delete_node);
}
return head;
}
//链表反转
LinkedList reverse(LinkedList head) {
if (head == NULL) {
return head;
}
Node *current_node, *next_node; //一个是用来保存当前遍历的结点 一个是用来存储当前遍历结点的下一个结点
current_node = head->next; //首先移动到第2个结点
head->next = NULL;//将首结点的下一个结点设置为空
while (current_node != NULL) {
next_node = current_node->next;//将当前结点的下一个结点保存起来
current_node->next = head;//将当前结点的下一个结点设置为头结点
head = current_node;//将头结点设置为当前结点
current_node = next_node;//将当前结点进行更新
}
return head;
}
//链表内存的清空
void clear(LinkedList head) {
Node *current_node = head;
while (current_node != NULL) {
Node *delete_node = current_node;
current_node = current_node->next;
free(delete_node);
}
}
网友评论