赞
踩
反转一个单链表。
示例:
- 输入: 1->2->3->4->5->NULL
- 输出: 5->4->3->2->1->NULL
解决方案:
头插法
开辟新链表并逐个读取旧链表,头插进新链表,这样新的链表与原链表的结构就是反的,
需要借助辅助空间
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * ListNode *next;
- * ListNode(int x) : val(x), next(NULL) {}
- * };
- */
- class Solution {
- public:
- ListNode* reverseList(ListNode* head) {
- ListNode* pNewHead=NULL;
- ListNode* pCur=head;
-
- while(pCur)
- {
- head=head->next;
- pCur->next=pNewHead;
- pNewHead=pCur;
- pCur=head;
- }
- return pNewHead;
- }
- };
优化解决方案:
可以在原地进行反转,不需要借助辅助空间,比如使用三个指针按顺序依次读取链表,再将读到的值传递给下一个指针,由于这三个指针的链接顺序与链表的顺序时相反的,因此最终结果就是反的。
注意:先挪p1再挪p2再p3,因为三个指针的顺序与链表相反,而先动后面节点前面的就找不见了
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * ListNode *next;
- * ListNode(int x) : val(x), next(NULL) {}
- * };
- */
- class Solution {
- public:
- ListNode* reverseList(ListNode* head) {
- ListNode* pPre=NULL;
- ListNode* pCur=head;
- ListNode* pNext=NULL;
- while(pCur)
- {
- pNext=pCur->next;
- pCur->next=pPre;
- pPre=pCur;
- pCur=pNext;
- }
- return pPre;
- }
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。