C/C++筆試經典——連結串列倒序

beachboyy發表於2014-07-03

設連結串列節點為:

typedef struct tagListNode{
    int data;
    struct tagListNode* next;
}ListNode, *List;

要求將一帶連結串列頭List head的單向連結串列逆序。

分析:

  1). 若連結串列為空或只有一個元素,則直接返回;

  2). 設定兩個前後相鄰的指標p,q. 將p所指向的節點作為q指向節點的後繼;

  3). 重複2),直到q為空

  4). 調整連結串列頭和連結串列尾

示例:以逆序A->B->C->D為例,圖示如下


實現及測試程式碼如下:

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

typedef struct tagListNode{
    int data;
    struct tagListNode* next;
}ListNode, *List;

void PrintList(List head);
List ReverseList(List head);

int main()
{
    //分配連結串列頭結點
    ListNode *head;
    head = (ListNode*)malloc(sizeof(ListNode));
    head->next = NULL;
    head->data = -1;

    //將[1,10]加入連結串列
    int i;
    ListNode *p, *q;
    p = head;
    for(int i = 1; i <= 10; i++)
    {
        q = (ListNode *)malloc(sizeof(ListNode));
        q->data = i;
        q->next = NULL;
        p->next = q;
        p = q;        
    }

    PrintList(head);           /*輸出原始連結串列*/
    head = ReverseList(head);  /*逆序連結串列*/
    PrintList(head);           /*輸出逆序後的連結串列*/
    return 0;
}

List ReverseList(List head)
{
    if(head->next == NULL || head->next->next == NULL)  
    {
       return head;   /*連結串列為空或只有一個元素則直接返回*/
    }

    ListNode *t = NULL,
             *p = head->next,
             *q = head->next->next;
    while(q != NULL)
    {        
      t = q->next;
      q->next = p;
      p = q;
      q = t;
    }

    /*此時q指向原始連結串列最後一個元素,也是逆轉後的連結串列的表頭元素*/
    head->next->next = NULL;  /*設定連結串列尾*/
    head->next = p;           /*調整連結串列頭*/
    return head;
}

void PrintList(List head)
{
    ListNode* p = head->next;
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("/n");
}

來自:http://blog.csdn.net/niuer09/article/details/5961004


相關文章