链表的反转

来源:互联网 发布:淘宝店代运营可靠吗 编辑:程序博客网 时间:2024/05/16 11:00

两种思路:第一种方法,设有新旧两个链表,新链表为要求反转后的链表,初始值为NULL,旧链表为原链表。每次旧链表上取一个结点放在新链表的表头,直到旧链表取完,重新设置表头,则新链表就是反序的。

简单演示一下:null,     L->1->2->3->4->5…

第一步之后变成:L,     null<-1,      2->3->4->5…

第二部:L,          null<-1<-2,        3->4->5…

直到最后,把L指向新的表头。

代码如下:

void ReverseLinkedList(LinkedList* L){    if(L == NULL || L->pNext == NULL)   //如果链表不存在或只有头指针,反转无意义        return;    LinkedList *prev, *curr, *next;    curr = L->pNext;    prev = NULL;    while(curr)    {        next = curr->pNext;     //保存后面结点        curr->pNext = prev;     //取一个结点放在新链表中        prev = curr;            //处理元后移一位        curr = next;    }    L->pNext = prev;            //链表指向头结点}

第二种方法:每次把结点放到首结点的位置,选取的结点总是原链表首结点后面的一个结点。

同样以上面的例子为例:L->1->2->3->4->5->…->NULL

第一步之后:L->2->1->3->4->5->…->NULL

第二步之后:L->3->2->1->4->5->…->NULL

注意总是把原链表首结点1后面的结点提到首结点位置。代码如下:

void ReverseLinkedList1(LinkedList* L){    if(L == NULL || L->pNext == NULL)   //如果链表不存在或只有头指针,反转无意义        return;    LinkedList *curr, *next, *newNext;    curr = L->pNext;    while(curr->pNext)    {        next = curr->pNext;            //curr后面的结点提到最前面,curr保存的值不变,但是它的位置在移动        newNext = next->pNext;        curr->pNext = newNext;        next->pNext = L->pNext;         //放到首结点之前        L->pNext = next;    }}

测试代码:

#include <iostream>using namespace std;struct LinkedList{int value;LinkedList* pNext;};LinkedList* Init(){LinkedList* L = new LinkedList[1];if(L == NULL)cout << "out of memory" << endl;L->pNext = NULL;return L;}void Insert2Tail(LinkedList *L, int num){LinkedList *tmp = new LinkedList[1];if(NULL == tmp)cout << "Out of memory" << endl;tmp->value = num;tmp->pNext = NULL;LinkedList *node = L;while(node->pNext != NULL)node = node->pNext;node->pNext = tmp;}void print(LinkedList* L){if(L==NULL || L->pNext==NULL)cout << "No valid value!" << endl;LinkedList* node = L->pNext;while(node != NULL){cout << node->value << " ";node = node->pNext;}cout << endl;}void ReverseLinkedList(LinkedList* L){    if(L == NULL || L->pNext == NULL)   //如果链表不存在或只有头指针,反转无意义        return;    LinkedList *prev, *curr, *next;    curr = L->pNext;    prev = NULL;    while(curr)    {        next = curr->pNext;     //保存后面结点        curr->pNext = prev;     //取一个结点放在新链表中        prev = curr;            //处理元后移一位        curr = next;    }    L->pNext = prev;            //链表指向头结点}void ReverseLinkedList1(LinkedList* L){    if(L == NULL || L->pNext == NULL)   //如果链表不存在或只有头指针,反转无意义        return;    LinkedList *curr, *next, *newNext;    curr = L->pNext;    while(curr->pNext)    {        next = curr->pNext;            //curr后面的结点提到最前面,curr保存的值不变,但是它的位置在后移        newNext = next->pNext;        curr->pNext = newNext;        next->pNext = L->pNext;         //放到首结点之前        L->pNext = next;    }}int main() {// your code goes hereLinkedList *L = Init();for(int i = 1; i < 10; ++i)Insert2Tail(L, i);print(L);ReverseLinkedList(L);print(L);ReverseLinkedList1(L);print(L);return 0;}
参考阅读:链表表头和指向指针的指针






0 0
原创粉丝点击