单链表尾插法
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int val;
struct Node* next;
} Node;
// 创建链表
Node* create() {
Node* head;
head = (Node*)malloc(sizeof(Node));
head -> val = 0;
head -> next = NULL;
return head;
}
Node* getTail(Node* head) {
Node* p = head;
while (p -> next != NULL) {
p = p -> next;
}
return p;
}
// 尾插法
Node* insertTail(Node* tail, int n) {
Node* p = (Node*)malloc(sizeof(Node));
p -> val = n;
tail -> next = p;
p -> next = NULL;
return p;
}
// 删除指定元素
Node* delete(Node* head, int n) {
Node* current = head; // 当前要删除的结点
Node* prev = NULL; // 要删除结点的前一个结点
// 若还未遍历到指定结点
while (current != NULL && current -> val != n) {
prev = current; // 要删除结点的前结点后移
current = current -> next; // 同时current后移,继续寻找要删除的结点
}
// 此时current结点为空,意味着已遍历到链表末尾,仍未找到指定元素,则返回头结点
if (current == NULL) {
return head;
}
// 若要删除头结点
if (current == head) {
head = head -> next; // 将头结点更新为原头结点的下一个结点
} else {
// 删除的不是头结点
prev -> next = current -> next; // 调整prev结点的next指针指向需要删除的current结点原来指向的结点
}
free(current); // 删除current结点
return head;
}
// 打印
void printList(Node* head) {
Node* p = head -> next;
while (p != NULL) {
printf("%d ", p -> val);
p = p -> next;
}
}
int main() {
int a, b;
a = 1, b = 2;
Node* head = create();
Node* p = getTail(head);
p = insertTail(p, a);
p = insertTail(p, b);
p = insertTail(p, 3);
head = delete(head, 2);
printList(head);
return 0;
}