要求用两种方法,迭代和递归。
迭代方法:
/** * 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; } }