数据结构 —— 链表倒置

                               链表倒置

 

编程:用带头建立一单链表(用后插入法建立至少10个结点以上),要求在原链基础上,把该单链表倒置(原第一结点在最后,原最后一结点在第一个数据结点的位置)。

注意:不能直接用 list 类型来编程
#include 
using namespace std;

typedef struct Node* Position;
typedef Position List;
struct Node {
    int Data;
    List Next;
};

List CreatList(){
    List P = (List)malloc(sizeof(struct Node));
    P->Data = 0;
    P->Next = NULL;
    return P;
}

void AddElement(List head,int X){
    List T = head;
    while (T->Next != NULL){
        T = T->Next;
    }
    List P = (List)malloc(sizeof(struct Node));
    P->Data = X;
    P->Next = NULL;
    T->Next = P;
    return ;
}

void ShowList(List head){
    List T = head;
    while (T->Next != NULL){
        T = T->Next;
        cout << T->Data << endl;
    }
    return ;
}

// 完美的倒置,线性算法
// 在处理10个结点以上时每次访问两个结点,让后面的结点指向前一个
// 让头节点指向最后一个结点,让第一个结点指向NULL就OK了
// 如果需要处理3个以下的结点,在加入判断条件即可
void ReverseList(List head){
    List T = head;
    List L = T->Next;
    List M = L->Next;
    List R = M->Next;
    L->Next = NULL;

    while (R->Next != NULL){
        M->Next = L;
        L = M;
        M = R;
        R = R->Next;
    }
    R->Next = M;
    M->Next = L;
    T->Next = R;
    return ;
}

int main()
{
    List Head = CreatList();

    for (int i = 1;i <= 20;i ++){
        AddElement(Head,i);
    }
    ShowList(Head);
    cout << "*******" << endl;
    ReverseList(Head);
    ShowList(Head);
}

你可能感兴趣的:(数据,结构)