链表的反转
来源:互联网 发布:淘宝店代运营可靠吗 编辑:程序博客网 时间: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
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- ThingWorx : 3、为Thing添加valueStream(web显示曲线做准备)
- RxJava的初学随笔(二)
- 设计模式(4)——抽象工厂模式
- Android Studio :Error:(1, 0) Plugin is too old, please update to a more recent version, or set AND……
- iOS开发--根据label内容动态设定label大小
- 链表的反转
- TCP/IP、Http、Socket的区别
- python读取mnist
- 第一行代码-13.3 定制自己的日志工具
- Android <shape />的使用
- 设计模式(5)——建造者模式(Builder Pattern)
- 虚函数 纯虚函数 抽象类
- 使用poi来解析Excel的xls和xlsx
- React-DOM操作详解