题目:
Reverse a singly linked list.
Example:Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
解释:
单链表翻转。
循环写法,原地翻转:
python代码:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
#我觉得还是不要把head当做工作指针
if not head:
return None
pre=None
cur=head
while cur:
then=cur.next
cur.next=pre
pre=cur
cur=then
return pre
c++代码:
/**
* 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* pre=NULL;
ListNode* cur=head;
while(cur)
{
ListNode* then=cur->next;
cur->next=pre;
pre=cur;
cur=then;
}
return pre;
}
};
递归写法:
python代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head:
return None
if not head.next:
return head
p=head.next
n=self.reverseList(p)
head.next=None
p.next=head
return n
c++代码:
/**
* 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)
{
return NULL;
}
if (head->next==NULL)
{
return head;
}
ListNode* p=head->next;
ListNode* n=reverseList(p);
head->next=NULL;
p->next=head;
return n;
}
};
总结:
单链表翻转是要原地翻转的,原地翻转的循环解法是最经典的,需要记住。