要求用两种方法,迭代和递归。
迭代方法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if(head==NULL) return NULL;
struct ListNode* node = head->next;
struct ListNode* n = head;
struct ListNode* pre = head;
head->next = NULL;
while(node){
n = node->next;
node->next = pre;
pre = node;
node=n ;
}
return pre;
}
递归方法:
# Definition for singly-linked list.
# class ListNode
# attr_accessor :val, :next
# def initialize(val)
# @val = val
# @next = nil
# end
# end
# @param {ListNode} head
# @return {ListNode}
def reverse_list(head)
if head.nil?
return nil
end
p = head.next
head.next = nil
if p
node,nh = reverse_list_node(p)
node.next = head
return nh
end
return head
end
def reverse_list_node(p)
if p.next != nil
node,nh = reverse_list_node(p.next)
node.next = p
return p,nh
else #tail
return p,p
end
end
递归方法主要需要考虑如何把新head传回去,ruby可以返回两个值就很方便了。
如果用C来实现的话,就需要把前后两个node都作为参数了。
struct ListNode* reverseListRecursive(struct ListNode* pre, struct ListNode* cur);
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if(head==NULL) return NULL;
struct ListNode* node = head->next;
head->next = NULL;
if(node)
return reverseListRecursive(head,node);
else
return head;
}
struct ListNode* reverseListRecursive(struct ListNode* pre, struct ListNode* cur){
struct ListNode* ret=NULL;
if(cur->next){
ret = reverseListRecursive(cur,cur->next);
cur->next = pre;
return ret;
}else{
cur->next = pre;
return cur;
}
}