当前位置:   article > 正文

反转链表 栈 三指针_指针栈翻转

指针栈翻转

传送门

分析:

本题主要考察程序的鲁棒性,主要注意一些特殊测试,例如:当输入的链表头指针为nullptr或者整个链表只有一个节点时,或者反转后的链表可能出现断裂

思路主要有两种:1.借助一个栈来实现,比较直观

2.三指针的做法,我们每次只进行相邻两个节点的反转,同时记录下一个节点指针,这是因为如果不记录下一个节点指针,我们将无法访问原链表,这样迭代进行。

三指针的做法,由于是原地进行,所以空间复杂度为O(1),同时由于只遍历一次原链表,时间复杂度也较栈的做法低。

栈:

  1. //翻转链表,也可以使用栈来实现
  2. /*
  3. struct ListNode {
  4. int val;
  5. struct ListNode *next;
  6. ListNode(int x) :
  7. val(x), next(NULL) {
  8. }
  9. };*/
  10. class Solution {
  11. public:
  12. Solution()
  13. {
  14. }
  15. ~Solution()
  16. {
  17. }
  18. ListNode* ReverseList(ListNode* pHead) {
  19. if(pHead==nullptr) return nullptr;
  20. stack<int>solve;
  21. while(!solve.empty()) solve.pop();
  22. ListNode* pNode = pHead;
  23. while(pNode!=nullptr)
  24. {
  25. solve.push(pNode->val);
  26. pNode = pNode->next;
  27. }
  28. ListNode* pNew = new ListNode(solve.top());
  29. solve.pop();
  30. ListNode* pre = pNew;
  31. while(!solve.empty())
  32. {
  33. int v = solve.top();
  34. solve.pop();
  35. ListNode* now = new ListNode(v);
  36. pre->next = now;
  37. pre = now;
  38. }
  39. return pNew;
  40. }
  41. };

三指针

  1. /*
  2. struct ListNode {
  3. int val;
  4. struct ListNode *next;
  5. ListNode(int x) :
  6. val(x), next(NULL) {
  7. }
  8. };*/
  9. class Solution {
  10. public:
  11. Solution()
  12. {
  13. }
  14. ~Solution()
  15. {
  16. }
  17. ListNode* ReverseList(ListNode* pHead) {
  18. if(pHead==nullptr) return nullptr;
  19. ListNode* pPre = nullptr;
  20. ListNode* pNode = pHead;
  21. ListNode* pReversedNode = nullptr;
  22. while(pNode!=nullptr)
  23. {
  24. ListNode* pNext = pNode->next;
  25. if(pNext==nullptr)
  26. {
  27. pReversedNode = pNode;
  28. }
  29. pNode->next = pPre;
  30. pPre = pNode;
  31. pNode = pNext;
  32. }
  33. return pReversedNode;
  34. }
  35. };

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号