【python-leetcode92-翻转链表】反转链表2

问题描述:

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
class ListNode:
    def __init__(self,x):
        self.val=x
        self.next=None
n1=ListNode(1)
n2=ListNode(2)
n3=ListNode(3)
n4=ListNode(4)
n5=ListNode(5)
n1.next=n2;n2.next=n3;n3.next=n4;n4.next=n5

def printListNode(head):
    while head != None:
        print(head.val)
        head=head.next
#printListNode(n1)

class Solution:
    def reverseBetween(self, head, m, n):
        if not head:
            return None

        cur, prev = head, None
        while m > 1:
            prev = cur
            cur = cur.next
            m, n = m - 1, n - 1

        p2, p1 = cur, prev

        while n:
            third = cur.next
            cur.next = prev
            prev = cur
            cur = third
            n -= 1

        if p1:
            p1.next = prev
        else:
            head = prev
        p2.next = cur
        return head
s=Solution()
s.reverseBetween(n1,2,4)
printListNode(n1)

具体过程:

初始状态:

进入第一个while循环之后:

之后定义两个链接指针,p1,p2

进入第二个while循环:

第一步:

第二步:

第三步:

此时退出循环。

然后p1.next指向prev,p2.next指向cur

原文地址:https://www.cnblogs.com/xiximayou/p/12368741.html

时间: 2024-11-10 14:11:43

【python-leetcode92-翻转链表】反转链表2的相关文章

单链表反转python实现

单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: class ListNode: def __init__(self,x): self.val=x; self.next=None; def nonrecurse(head): #循环的方法反转链表 if head is None or head.next is None: return head; pre=None; c

数据结构69:链表逆置,链表反转,链表翻转

链表翻转,简单地理解,就是将链表的头部结点变为链表的尾部结点,与此同时将原链表的尾部结点变成头部结点.如下图所示: 图 1 链表翻转示意图 提示:H 为头指针,图示中的链表无头结点,头指针直接指向首元结点. 将链表进行翻转的方法有多种,本节给大家介绍两种实现方法. 方法一 实现链表翻转最直接的方法就是:从链表的头部开始遍历每个结点,改变每个结点的指向,即将原本指向下一个结点的指针改为指向上一个结点. 唯一比较特殊的是,链表中的首元结点(第一个结点)前面没有结点,所以在改变其指针指向的时候,要将其

剑指offer反转链表python

题目描述 输入一个链表,反转链表后,输出新链表的表头. 思路 定义三个指针,pHead, cur,forward 反转的时候,cur.next指向pHead,然后三个指针依次向后移动,具体过程看代码. 代码 # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回ListNode def ReverseList(s

链表反转leetcode206

最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的多了再用C++总是忘记敲分号和括号,甚至Compile Error了几次 = =.尴尬 链表反转比较简单,首先用自己的"本科"方法做了一下,发现效率并不高: 1 class Solution { 2 public: 3 ListNode* reverseList(ListNode* hea

剑指OFFER之反转链表(九度OJ1518)

题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数.输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素. 输出: 对应每个测试案例,以此输出链表反转后的元素,如没有元素则输出NULL. 样例输入: 5 1 2 3 4 5 0 样例输出: 5 4 3 2 1 NULL 解题思路:

【剑指offer】递归循环两种方式反转链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25737023 本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上AC. 题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数.输入的第二行包含n个整数t(0<=t<=1000000)

笔试算法题(13):反转链表 &amp; 左旋转字符串

出题:反转链表(递归和非递归解法): 分析:有递归跟非递归实现,注意对原始链表头节点的处理,因为其他节点都指向下一个节点,其需要指向NULL: 解题: 1 struct Node { 2 int v; 3 Node *next; 4 }; 5 Node* NonRecursiveListReverse(Node *head) { 6 if(head == NULL) return NULL; 7 Node *previous=NULL, *current=head, *temp=NULL; 8

链表——按k个结点一组来反转链表

题目:按k个结点一组来反转链表 思路: 运用反转链表的通法reverse,对链表进行循环,当计数长度k不时,指针继续前进:当计数长度到达k时,将该组首尾节点first和node作为参数传入翻转函数reverse进行翻转,然后重新拼接到原链表中.直至到达链表末尾. 代码如下: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x)

Leetcode 92. 反转链表 II

反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL 思路:分成两个情况来写第一种:如果m=1,那就是一道反转链表,先翻转m-n的节点,翻转后,头结点就变成了尾节点,所以把这些节点保存起来,然后再把后面的节点接到尾节点第二种:如果!=1,翻转m到n的中间节点即可 1 p

反转链表(important!)

题目描述 输入一个链表,反转链表后,输出新链表的表头. 解题思路 直接在原链表上操作,不需要新的链表 python solution: # -*- coding:utf-8 -*- class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: # 返回ListNode def ReverseList(self, pHead): pre,next = None,None while pHea