当前位置:   article > 正文

链表面试题:反转单链表_本关任务:设计一个链表模板类,具备 push (向链表尾部添加元素),reverse (反转链表

本关任务:设计一个链表模板类,具备 push (向链表尾部添加元素),reverse (反转链表

反转一个单链表。

示例:

  1. 输入: 1->2->3->4->5->NULL
  2. 输出: 5->4->3->2->1->NULL

解决方案:

头插法

开辟新链表并逐个读取旧链表,头插进新链表,这样新的链表与原链表的结构就是反的,

需要借助辅助空间

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* reverseList(ListNode* head) {
  12. ListNode* pNewHead=NULL;
  13. ListNode* pCur=head;
  14. while(pCur)
  15. {
  16. head=head->next;
  17. pCur->next=pNewHead;
  18. pNewHead=pCur;
  19. pCur=head;
  20. }
  21. return pNewHead;
  22. }
  23. };

优化解决方案:

可以在原地进行反转,不需要借助辅助空间,比如使用三个指针按顺序依次读取链表,再将读到的值传递给下一个指针,由于这三个指针的链接顺序与链表的顺序时相反的,因此最终结果就是反的。

注意:先挪p1再挪p2再p3,因为三个指针的顺序与链表相反,而先动后面节点前面的就找不见了

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* reverseList(ListNode* head) {
  12. ListNode* pPre=NULL;
  13. ListNode* pCur=head;
  14. ListNode* pNext=NULL;
  15. while(pCur)
  16. {
  17. pNext=pCur->next;
  18. pCur->next=pPre;
  19. pPre=pCur;
  20. pCur=pNext;
  21. }
  22. return pPre;
  23. }
  24. };

 

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

闽ICP备14008679号