反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
我直接可以想到的方法就是用三個指針,從前往後遍歷了
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL) return NULL;
ListNode* p = NULL;//head的前一個指針
ListNode* Cur = head->next;//head的後一個指針
while (head)
{
head->next = p;
p = head;
head = Cur;
if(head) Cur = head->next;
}
return p;//head爲空時,p就是最後一個結點了
}
};
面試時,當面試官讓你寫這道題時,往往最終不是讓你描述三個指針循環或者入棧出棧等方法,還有一個真的沒想到啊----遞歸
遍歷鏈表,讓倒數第二個節點的下一個節點的下一個節點指向自身(相當於把指針方方向變了),再讓當前節點的下一個節點置空
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL)
return head;
ListNode* newhead = reverseList(head->next);
head->next->next = head;//變指針方向
head->next = NULL;
return newhead;
}
};