Reverse a singly linked list.
Hint:
递归解法的思路是,不断的进入递归函数,直到head指向最后一个节点,p指向之前一个节点,然后调换head和p的位置,再返回上一层递归函数,再交换p和head的位置,每次交换后,head节点后面都是交换好的顺序,直到p为首节点,然后再交换,首节点就成了为节点,此时整个链表也完成了翻转
A linked list can be reversed either iteratively or recursively. Could you implement both?
|prev |cur |next
v v v
--- --- --- ---
NULL | |-->| |-->| |-->...-->| |-->NULL
--- --- --- ---
I
3 5
2|prev |cur |next
v v v
--- --- --- ---
NULL<--| |<--| | | |-->...-->| |-->NULL
1 --- 4 --- --- ---
主要是头结点平移时候注意cur->next是怎么连接的。
pre->next=head->next;而不是cur->next;
/**
* 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) {
//因为节点头有数据 创建一个空的头结点
if(!head) return head;
ListNode* temp=new ListNode(NULL);
temp->next=head;
ListNode* cur=head;
while(cur->next)
{
ListNode* pre=cur->next;
cur->next=pre->next;
pre->next=temp->next;//最主要的一步 怎么倒置连接
temp->next=pre;
}
return temp->next;
}
};
递归解法的思路是,不断的进入递归函数,直到head指向最后一个节点,p指向之前一个节点,然后调换head和p的位置,再返回上一层递归函数,再交换p和head的位置,每次交换后,head节点后面都是交换好的顺序,直到p为首节点,然后再交换,首节点就成了为节点,此时整个链表也完成了翻转
/**
* 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) {
if(!head || !head->next) return head;
ListNode *p = head;
head = reverseList(p->next);
p->next->next = p;
p->next = NULL;
return head;
}
};
/**
* 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) {
if(head==NULL || head->next==NULL) return head;
ListNode* p=head;
ListNode* cur=head->next;
p->next=NULL;
while(cur!=NULL)
{
ListNode* temp=cur->next;
cur->next=p;
p=cur;
cur=temp;
}
return p;
}
};