单链表尾插法

#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;
}