我的方法
思路:新建一个链表,倒着把Input中的结点插入新链表。结果:Run Code显示正确,但是提交后显示:Runtime Error.
/**
* 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* L=new ListNode(head->val);
L->val=head->val; L->next=NULL;//初始化末尾结点
while(head->next!=NULL){
head=head->next;//head指向Input的下一个结点
ListNode* node=new ListNode(head->val);
node->next=L;//新结点指向L
L=node;//L指向新结点
}
return L;
}
};
迭代法
思路:建立两个指针,分别指向当前结点和它的前驱结点。修改每个结点的后继结点。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev=NULL;
ListNode* curr=head;
while(curr!=NULL){
ListNode* nextTemp=curr->next;//先保存一下curr的后继
curr->next=prev;//只需要修改curr的后继
prev=curr;//更新prev
curr=nextTemp;//更新curr
}
return prev;
}
};
递归法
思路:如果前面已经翻转了,那么只需对第一个结点进行操作就可以了。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==NULL||head->next==NULL)return head;
ListNode* p=reverseList(head->next);//已经变成5/4/3/2了
head->next->next=head;
head->next=NULL;
return p;
}
};