您的位置:首页 > 其它

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 
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 链表反转