题目描述
翻转一个链表
样例
给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null
挑战
在原地一次翻转完成
分析
看完题目第一个想到的就是用递归,每次让最后一个节点的next指针指向他的前置节点。
代码
/**
* Definition of ListNode
*
* class ListNode {
* public:
* int val;
* ListNode *next;
*
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param head: n
* @return: The new head of reversed linked list.
*/
ListNode * reverse(ListNode * head) {
// write your code here
if(head == NULL) {
return NULL;
} else if(head->next == NULL) {
return head;
} else {
ListNode *p = head;
while(p->next->next != NULL) {
p = p->next;
}
ListNode *q = p->next;
p->next = NULL;
q->next = reverse(head);
}
}
};
优化
对于挑战的要求,个人理解就是一次性将整个链表反过来而不是一个一个往回倒。于是就想到可以利用栈的特点——先进后出,后进先出,这样就可以实现翻转了。个人理解仅供参考,代码如下:
/**
* Definition of ListNode
*
* class ListNode {
* public:
* int val;
* ListNode *next;
*
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param head: n
* @return: The new head of reversed linked list.
*/
ListNode * reverse(ListNode * head) {
// write your code here
stack <ListNode>stk;
ListNode *p = head;
if(head == NULL) return NULL;
while(p != NULL) {
stk.push(*p);
p = p->next;
}
ListNode *newhead = new ListNode(stk.top().val);
stk.pop();
p = newhead;
while(!stk.empty())
{
ListNode *q = new ListNode(stk.top().val);
p->next = q;
p = p->next;
stk.pop();
}
p->next = NULL;
return newhead;
}
};
改完看看还有没有更好的办法,看到了一个没有用递归,代码也很精简的。这是链接