zoukankan      html  css  js  c++  java
  • 【python-leetcode206-翻转链表】反转链表

    问题描述:

    反转一个单链表。

    示例:

    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL
    进阶:
    你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

    首先是迭代方式:

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def reverseList(self, head: ListNode) -> ListNode:
            if not head or head.next == None:
                return head
            p1=None
            p2=head
            while p2:
                t=p2.next
                p2.next = p1
                p1 = p2
                p2 = t
            return p1
            
            

    过程:

    关键之处,先要找到p2的下一个节点,然后再断开p2.next并指向p1

    然后p1,p2同时右移,保证p1每次都在p2的前面 

    这样每次就可以让p2.next=p1

    结果:

    递归版本的:

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def reverseList(self, head: ListNode) -> ListNode:
            if not head or head.next == None:
                return head
            p1=head.next
            p2=self.reverseList(p1)
            head.next=None
            p1.next=head
            return p2

    过程:

    首先是:

    然后是以p1为头结点的链表:

    依次类推直到头结点不为空或头结点的下一节点不为空,也就是:

    此时此时返回的值就是p2,也就是最后一个节点。之后就翻转当前的链表:

    依次递推即可:

    需要明确的是:先会一直执行:

    p2=self.reverseList(p1)

    得到返回值之后才会执行:

    head.next=None

    p1.next=head

    最后返回p2即可。

    结果:

  • 相关阅读:
    二分图匹配(匈牙利算法)
    最长共公子序列(LCS)
    网页常用Js代码
    linux 服务器常用命令整理
    阿里云学生服务器搭建网站-Ubuntu16.04安装php开发环境
    BAT批处理中的字符串处理详解(字符串截取)
    DOS批处理高级教程(还不错)(转)
    EntityFramework的linq扩展where
    RestSharp发送请求得到Json数据
    socket
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12363446.html
Copyright © 2011-2022 走看看