首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

单链表创建与就地逆序完整教程(C 语言)

     編輯:關於C語言

节点定义

typedef struct Node {
    int data;
    struct Node *next;
} Node;

1. 尾插法创建链表(带哨兵头节点)

Node* create_list() {
    Node *head = (Node*)malloc(sizeof(Node));
    head->next = NULL;
    Node *tail = head;

    int val;
    printf("请输入整数,0 结束: ");
    while (scanf("%d", &val) == 1 && val != 0) {
        Node *p = (Node*)malloc(sizeof(Node));
        p->data = val; p->next = NULL;
        tail->next = p;
        tail = p;
    }
    return head; // 头节点不存数据
}

2. 打印链表

void print_list(Node *head) {
    for (Node *p = head->next; p; p = p->next)
        printf("%d ", p->data);
    puts("");
}

3. 就地逆序(头插法,最推荐)

void reverse_list(Node *head) {
    Node *cur = head->next;
    head->next = NULL;            // 摘空原链表
    while (cur) {
        Node *nxt = cur->next;
        cur->next = head->next;   // 头插
        head->next = cur;
        cur = nxt;
    }
}

4. 完整可运行主程序

int main() {
    Node *head = create_list();
    printf("原链表: "); print_list(head);
    reverse_list(head);
    printf("逆序后: "); print_list(head);

    // 释放内存
    Node *p = head;
    while (p) { Node *tmp = p; p = p->next; free(tmp); }
    return 0;
}

输入输出示例

请输入整数,0 结束: 1 2 3 4 5 0
原链表: 1 2 3 4 5
逆序后: 5 4 3 2 1

算法对比

方法代码行数易错点推荐度
头插法~6忘记 head->next=NULL 成环★★★★★
三指针迭代~10循环条件、尾节点处理★★★☆☆
递归~5栈溢出、尾递归优化不确定★★☆☆☆

常见错误与调试

  • 成环:head->next 未置 NULL,导致原首节点 next 仍指向第二节点,形成环。valgrind 或打印检测。
  • 内存泄漏:逆序后未释放,或释放时 free(head) 后继续访问 head->next。先保存 next 再 free。
  • 空表/单节点:reverse_list 需正确处理 head->next==NULL 或仅一个数据节点的情况(头插法天然支持)。

扩展练习

  1. 不使用头节点,函数返回新头指针 Node* reverse(Node*)。
  2. 反转部分链表 reverse_between(head, m, n)(LeetCode 92)。
  3. K 个一组反转 reverseKGroup(head, k)(LeetCode 25)。
  4. 检测链表是否有环(Floyd 快慢指针)。

总结

单链表创建用尾插法,逆序用头插法,是 C 语言链表操作的两大基础模式。掌握“哨兵头节点简化边界”、“头插法原地逆序”、“内存申请释放配对”三大核心技巧,即可从容应对绝大多数链表题目与工程场景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved