链表反转

 
 
原始单链表:
反转后单链表:
 
反转过程如下:
1、next = head.next, 将head.next赋值给next变量,即next指向了节点2,先将节点2保存起来。
2、head.next = pre (初始pre==None), 将pre变量赋值给head.next,即此时节点1指向了None。
3、pre=head,即pre指向节点1,将节点1设为“上一个节点”。
4、head=next,将head指向节点2,此时节点2位“头节点”。
 
第一次循环完毕,进入第二次循环,如下图:
1、next = head.next, 将head.next赋值给next变量,即next指向了节点3,先将节点3保存起来。
2、head.next = pre (此时pre不为None), 将pre变量赋值给head.next,pre在上一次循环时指向节点1, 那么这一步的意义就是节点2 指向了 节点1,完成1和2节点的反转
3、pre=head,将head赋值给pre,即pre指向节点2,将节点2设为“上一个节点”。
4、head=next,将next赋值给head,即head指向节点3,此时节点3为“头节点”。
 
第二次循环完毕,以此类推!第三次第四次第五次循环。最后反转成如下图:
 
若干注意点:
(1)帮助记忆图:
(2)当前头节点的下一个节点一定要保存(比如:当前头节点为2,先将节点3 保存起来)
(3)实现反转的key point:head.next = pre
 

1、反转链表代码

# -*- coding: utf-8 -*-


class Node(object):  # 链表结构
    def __init__(self, elem, next_=None):
        self.elem = elem
        self.next = next_

def reverse_list(head):
    if head is None or head.next is None:  # 若链表为空或者仅一个数就直接返回
        return head
    pre = None
    next = None
    while (head is not None):
        next = head.next  # 1 保存当前头节点的下一个节点
        head.next = pre   # 2 反转
        pre = head        # 3 上一个节点
        head = next       # 4 新的头节点
    return pre


if __name__ == '__main__':
    old_node = Node(3)  # 建立链表3->2->1->9->None
    old_node.next = Node(2)
    old_node.next.next = Node(1)
    old_node.next.next.next = Node(9)
    print("old_node:%s" % old_node)  # old_node:<__main__.Node object at 0x000001F745760DA0>
    new_node = reverse_list(old_node)
    print(new_node.elem, new_node.next.elem, new_node.next.next.elem, new_node.next.next.next.elem) # 9 1 2 3

 

 

2、递归法对链表反转

# -*- coding: utf-8 -*-


class Node(object):  # 链表结构
    def __init__(self, elem, next_=None):
        self.elem = elem
        self.next = next_


def reverse_list(head):
    """
    :type head: ListNode
    :rtype: ListNode
    """
    if not head;
        return  None
    if not head.next:  # 若链表为空或者仅一个数就直接返回
        return head

    new_headNode = reverse_list(head.next)
    head.next.next = head
    head.next = None
    return new_headNode


if __name__ == '__main__':
    old_node = Node(3)  # 建立链表3->2->1->9->None
    old_node.next = Node(2)
    old_node.next.next = Node(1)
    old_node.next.next.next = Node(9)
    print("old_node:%s" % old_node)  # old_node:<__main__.Node object at 0x000001F745760DA0>
    new_node = reverse_list(old_node)
    print(new_node.elem, new_node.next.elem, new_node.next.next.elem, new_node.next.next.next.elem)  # 9 1 2 3


 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值