LeetCode 92 Reverse Linked List II (Python详解及实现)
2017-08-10 11:09
786 查看
【题目】
Reverse a linked list from position m to n.Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL, m= 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
【思路】
定义指针关注是否到m和n的位置,到达后m后将链表断开成左右两部分A、B,继续移动到达n时将链表分成两部分B、C,这样可以提取出m,n段即B部分,然后将B部分反转后,与AC重新连接即可。
例1->2->3->4->5->NULL过程:
l 初始状态
# 0 ----> 1 ----> 2 ----> 3 ----> 4 ----> 5
# prev curr
l 第一个while循环(m=2,n=4)执行完状态:
# 0 ----> 1 ----> 2 ---->3 ----> 4 ----> 5
# prev curr
l 执行last_unswapped,first_swapped = prev, curr,开始断开的结点m前一个点
# 0 -------> 1 ----------------------->2 ------------------------> 3 ----> 4 ----> 5
# last_unswapped first_swapped
l 第二个while循环(m=2,n=4)执行状态:
# diff=2 # 1 <-- 2 3 ----> 4 ---->5
# prev curr
# diff=1 # 1 <-- 2 <--3 4 ----> 5
# prev curr
# diff=0 # 1 <-- 2 <-- 3<-- 4 5
# prev curr
l 执行last_unswapped.next= prev,first_swapped.next = curr,结束断开的结点n后的点。执行上main两条语句后状态:
【Python实现】
Reverse a linked list from position m to n.Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL, m= 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
【思路】
定义指针关注是否到m和n的位置,到达后m后将链表断开成左右两部分A、B,继续移动到达n时将链表分成两部分B、C,这样可以提取出m,n段即B部分,然后将B部分反转后,与AC重新连接即可。
例1->2->3->4->5->NULL过程:
l 初始状态
# 0 ----> 1 ----> 2 ----> 3 ----> 4 ----> 5
# prev curr
l 第一个while循环(m=2,n=4)执行完状态:
# 0 ----> 1 ----> 2 ---->3 ----> 4 ----> 5
# prev curr
l 执行last_unswapped,first_swapped = prev, curr,开始断开的结点m前一个点
# 0 -------> 1 ----------------------->2 ------------------------> 3 ----> 4 ----> 5
# last_unswapped first_swapped
l 第二个while循环(m=2,n=4)执行状态:
# diff=2 # 1 <-- 2 3 ----> 4 ---->5
# prev curr
# diff=1 # 1 <-- 2 <--3 4 ----> 5
# prev curr
# diff=0 # 1 <-- 2 <-- 3<-- 4 5
# prev curr
l 执行last_unswapped.next= prev,first_swapped.next = curr,结束断开的结点n后的点。执行上main两条语句后状态:
【Python实现】
# -*- coding: utf-8 -*- """ Created on Thu Aug 10 10:18:04 2017 @author: Administrator """ # Definition for singly-linked list. class ListNode(object): def __init__(self, x): self.val = x self.next = None class Solution(object): def reverseBetween(self, head, m, n): """ :type head: ListNode :type m: int :type n: int :rtype: ListNode """ dummy, partial_len = ListNode(0), n - m dummy.next = head prev, curr = dummy, dummy.next #取出mn之间的结点,并反转 while m > 1:#pre是开始反转的结点 prev, curr = curr, curr.next m -= 1 last_unswapped, first_swapped = prev, curr while curr and partial_len >= 0:#pre是结束反转的结点 curr.next, prev, curr = prev, curr, curr.next partial_len -= 1 #重新连接结点 last_unswapped.next, first_swapped.next = prev, curr return dummy.next if __name__ == '__main__': S = Solution() l1 = ListNode(1) l2 = ListNode(2) l3 = ListNode(3) l4 = ListNode(4) l5 = ListNode(5) head = l1 l1.next = l2 l2.next = l3 l3.next = l4 l4.next = l5 l5.next = None S.partition(head,2,4)
相关文章推荐
- leetcode 【 Reverse Linked List II 】 python 实现
- [leetcode 92]Reverse Linked List II
- 【leetcode】【92】Reverse Linked List II
- Leetcode[92]-Reverse Linked List II
- leetcode_92_Reverse Linked List II
- [LeetCode]92 Reverse Linked List II
- 【LeetCode with Python】 Reverse Linked List II
- 【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】
- Reverse Linked List II Leetcode92
- [LeetCode] Reverse Linked List II @ Python [提供自创的示意图 Figure illustration]
- leetcode[92]:Reverse Linked List II
- [leetcode 92] Reverse Linked List II
- 92、Reverse Linked List II [Leetcode]
- 【leetcode】【单链表】【92】Reverse Linked List II
- [Leetcode 73] 92 Reverse Linked List II
- [leetcode]Reverse Linked List II @ Python
- LeetCode92之Reverse Linked ListII的 Java题解
- leetcode || 92、Reverse Linked List II
- Leetcode 92 Reverse Linked List II
- leetcode[92]Reverse Linked List II