Reverse the linked list–递归与迭代
本文以逆转单链表的例子解释递归与迭代
1.递归
递归就是 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。(百度百科)
总结:利用调用自身来不断缩小规模,直到达到退出条件,前提是,问题可以转化为相似的规模较小的问题,关键是退出条件设置。使用if….else…
2.迭代
迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。(百度百科)
总结:循环结构,将同一个函数或者一些操作重复多次,(递归是迭代的一个特例,递归可以转换为迭代,迭代不一定能转化为递归)使用for,while
3.实例
使用迭代的方法,逆转一个单链表:
p1->p2->tmp
将p1赋值给p2.next,实现了p2的逆转,然后再将p1,p2,tmp分别往后面瞬移一步,这是逆转一个节点的操作,迭代多次,即可实现单链表的逆转。具体leetcode 代码如下:
# 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
"""
p1 = None
p2 = head
while(p2 is not None):
tmp = p2.next
p2.next = p1
p1 = p2
p2 = tmp
return p1
使用递归的方法,逆转一个单链表:
思路:p1->p2->p3->p4,如果l1=p1->p2->p3,逆转l1->p4,如果l1是逆转的,逆转p4,即可逆转此单链表,以此类推再去处理l1,退出条件为p4->next=None
# 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
"""
if head==None or head.next==None:
return head
p=ListNode(0)
p=head
head = self.reverseList(p.next)
p.next.next = p
p.next = None
return head