首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言單向鏈表反轉:常見邏輯錯誤與正確實作

     編輯:程式設計綜合問答

原始程式碼問題分析

提供的反轉函式 Reverse() 存在邏輯缺陷:

  • 未處理空鏈表或單節點情況
  • 指標操作順序錯誤,導致鏈表斷裂或迴圈
  • 輸入迴圈結束條件 c!='\n' 不穩定,建議改用 sentinel 值

正確反轉演算法(迭代法)

LinkList Reverse(LinkList head) {
    LinkList prev = NULL;
    LinkList curr = head->next;
    LinkList next = NULL;

    while (curr != NULL) {
        next = curr->next;  // 保存下一節點
        curr->next = prev;  // 反轉指標
        prev = curr;        // 移動 prev
        curr = next;        // 移動 curr
    }
    head->next = prev;      // 更新頭節點
    return head;
}

完整可執行程式碼

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode {
    int node;
    struct LNode *next;
} LNode, *LinkList;

LinkList Head_Node() {
    LinkList head = (LinkList)malloc(sizeof(LNode));
    if (!head) { printf("記憶體配置失敗\n"); return NULL; }
    head->next = NULL;
    return head;
}

int CreateList(LinkList head) {
    int data; LinkList p, q = head;
    printf("請輸入資料(-1 結束):");
    while (scanf("%d", &data) == 1 && data != -1) {
        p = (LinkList)malloc(sizeof(LNode));
        if (!p) return -1;
        p->node = data; p->next = NULL;
        q->next = p; q = p;
    }
    return 0;
}

void Output(LinkList head) {
    LinkList p = head->next;
    while (p) { printf("%d ", p->node); p = p->next; }
    printf("\n");
}

int main() {
    LinkList head = Head_Node();
    CreateList(head);
    printf("原始鏈表:"); Output(head);
    Reverse(head);
    printf("反轉後:"); Output(head);
    return 0;
}

關鍵點總結

  1. 使用三指標法(prev, curr, next)逐節點反轉
  2. 頭節點不存放資料,僅作為入口
  3. 輸入結束條件建議使用特定值(如 -1)而非換行符
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved