伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

倒转链表:2个简单实现

目录

    一.使用vector容器二.调整指针法

大家好,今天和大家分享的是反转链表的两种方法,第一种是用泛型编程里面的STL,第二种是利用多个指针停止操作,小孩子才做选择,建议两个都学。我们往下看:

一.使用vector容器

ps:该方法对内存的需求较高,这是个缺点,可以直接使用STL容器自带的reverse停止反转(将vector容器内的结点停止反转,然后再用for循环将他串联起来),实现起来相对容易,思路不太复杂。
请看以下代码:
  1. typedef struct Node
  2. {
  3. int val;
  4.   struct Node*next;
  5. }ListNode;
  6. class traverse {
  7. public:
  8.     ListNode* ReverseList(ListNode* pHead) {
  9.         if (!pHead) return nullptr;
  10.         vector<ListNode*> v;
  11.         while (pHead) {
  12.             v.push_back(pHead);
  13.             pHead = pHead->next;
  14.         }
  15.         reverse(v.begin(), v.end()); // 反转vector,也可以逆向遍历
  16.         ListNode *head = v[0];
  17.         ListNode *cur = head;
  18.         for (int i=1; i<v.size(); ++i) { // 构造链表
  19.             cur->next = v[i]; // 当前节点的下一个指针指向下一个节点
  20.             cur = cur->next; // 当前节点后移
  21.         }
  22.         cur->next = nullptr; // 切记最后一个节点的下一个指针指向nullptr
  23.         return head;
  24.     }
  25. };
复制代码
此方法的复杂度:
时间复杂度:O(n)
空间复杂度:O(n), 用了一个vector来存单链表

二.调整指针法

ps:此方法更加妥当,能得到更多人的喜欢,很好的利用几个指针的指向反转一个链表。
初始化:3个指针
1)pre指针指向已经反转好的链表的最后一个节点,最开端没有反转,所以指向nullptr
2)cur指针指向待反转链表的第一个节点,最开端第一个节点待反转,所以指向head
3)nex指针指向待反转链表的第二个节点,目的是保管链表,因为cur改变指向后,后面的链表则失效了,所以需要保管
接下来,循环执行以下三个操作
1)nex = cur->next, 保管作用
2)cur->next = pre 未反转链表的第一个节点的下个指针指向已反转链表的最后一个节点
3)pre = cur, cur = nex; 指针后移,操作下一个未反转链表的第一个节点
循环条件,当然是cur != nullptr
循环完毕后,cur当然为nullptr,所以返回pre,即为反转后的头结点
这里以1->2->3->4->5 举例:
倒转链表:2个简单实现-1.png

倒转链表:2个简单实现-2.png

倒转链表:2个简单实现-3.png

倒转链表:2个简单实现-4.png

代码如下:
  1. class Solution {
  2. public:
  3.     ListNode* ReverseList(ListNode* pHead) {
  4.         ListNode *pre = nullptr;
  5.         ListNode *cur = pHead;
  6.         ListNode *nex = nullptr; // 这里可以指向nullptr,循环里面要重新指向
  7.         while (cur) {
  8.             nex = cur->next;
  9.             cur->next = pre;
  10.             pre = cur;
  11.             cur = nex;
  12.         }
  13.         return pre;
  14.     }
  15. };
复制代码
此方法复杂度:
时间复杂度:O(n), 遍历一次链表
空间复杂度:O(1)
总结:要从易懂的角度来看,第一种不失是好的,使用STL,我如今才大一,我听说一些面试是不允许使用STL这一内容解体的。第二种方法很妙,复杂度是比较理想的,而且用到了灵魂指针的应用。建议大家多琢磨一下第二种方法。
到此这篇关于C++实现反转链表的两种方法的文章就介绍到这了,更多相关C++ 反转链表内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站!

回复

举报 使用道具

相关帖子
全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

宁立
注册会员
主题 24
回复 14
粉丝 0
|网站地图
快速回复 返回顶部 返回列表