LeetCode----Reverse Linked List II
2015-09-25 17:15
302 查看
Reverse Linked List II
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given
return
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
代码:
------------------------------------------------------------------------------------------------------------------------------------------
2016-05-01补充:
代码:
class Solution(object):
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
if m == n:
return head
dummy = ListNode(0)
dummy.next = head
leftpre = dummy
for i in range(m - 1):
leftpre = leftpre.next
pre = leftpre.next # 此时的leftpre记录的为第m个节点
mid = pre.next
post = None
for i in range(n - m): # 进行第m个节点到第n个节点的链表反转
post = mid.next
mid.next = pre
pre = mid
mid = post
leftpre.next.next = mid
leftpre.next = pre
return dummy.next
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.
代码:
# 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 """ if m == n: return head mid = None # 代表中间的串的头部 right = None # 代表尾串的头部 p = head index = 0 if m == 1: while p: index += 1 if index == n: right = p.next p.next = None break p = p.next mid = self.reverseList(head) head = mid p = self.getLastNode(mid) p.next = right else: pre = None ppre = None while p: index += 1 if index == m: ppre = pre ppre.next = None mid = p if index == n: right = p.next p.next = None break pre = p p = p.next mid = self.reverseList(mid) mid_l = self.getLastNode(mid) ppre.next = mid mid_l.next = right return head def getLastNode(self, head): p = head while p.next: p = p.next return p def reverseList(self, head): pre, cur = None, head while cur: cur.next, pre, cur = pre, cur, cur.next return pre
------------------------------------------------------------------------------------------------------------------------------------------
2016-05-01补充:
代码:
class Solution(object):
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
if m == n:
return head
dummy = ListNode(0)
dummy.next = head
leftpre = dummy
for i in range(m - 1):
leftpre = leftpre.next
pre = leftpre.next # 此时的leftpre记录的为第m个节点
mid = pre.next
post = None
for i in range(n - m): # 进行第m个节点到第n个节点的链表反转
post = mid.next
mid.next = pre
pre = mid
mid = post
leftpre.next.next = mid
leftpre.next = pre
return dummy.next
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解
- LeetCode [Day 5] Longest Palindromic Substring 题解
- LeetCode [Day 6] ZigZag Conversion 题解