该题和以下这篇文章的进阶:
LeetCode206 && 剑指Offer 24:反转链表
目录
一、题目
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
二、示例
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
三、思路
整体思路就是将该链表拆分成三部分:前段 + 需要反转的链表段 + 后段 , 之后对需要反转的链表段进行反转,最后将三个链表段连接到一起,返回即可。具体做法:
- 第一步,找到需要反转的链表段
- 第二步,pre,post分表表示需要反转链表的前节点和后节点
- 第三步,定义一个函数,反转链表。关于函数的定义,可看文章LeetCode206 && 剑指Offer 24:反转链表
- 第四步,连接头部和尾部
- 最后,返回
四、代码
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
# 1 --> 2 --> 3 --> 4 --> 5 --> null m = 2, n = 4
# 1 --> 4 --> 3 --> 2 --> 5 --> null
# pre:1 post:5 h:2 t:4
# reverseList:反转链表
dummy = ListNode(None)
dummy.next = head
pre = dummy
for _ in range(m - 1):
pre = pre.next
# print(pre.val)
h = pre.next
# print(h.val)
t = h
for _ in range(n - m):
t = t.next
# print(t.val)
post = t.next
# print(post.val)
t.next = None
def reverseList(head):
if not head:
return None
pre, cur = head, None
while pre:
t = pre.next
pre.next = cur
cur = pre
pre = t
return cur
pre.next = reverseList(h)
h.next = post
return dummy.next
if __name__ == '__main__':
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
m, n = 2, 4
s = Solution()
ans = s.reverseBetween(head, m, n)
print(ans)