反转一个单链表。
示例:
输入: 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;
}
};