反转部分链表python_reverse linklist 反转链表的一部分 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->nullptr, m = 2 and n = 4,

return 1->4->3->2->5->nullptr.Note:

Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.

思路:对【m, n】区间的数进行头插法插入

0818b9ca8b590ca3270a3433284dd417.png

代码如下:

# coding=utf-8

"""思路就是针对反转区间的数使用头插法,逻辑比较繁琐"""

class LinkNode(object): # 定义链表节点

def __init__(self, val, nextnode=None):

self.val = val

self.nextnode = nextnode

class Solution(object):

def reverse_between(self, linkroot=None, m=0, n=0):

root = LinkNode(0) # 处理反转起始位置为1,而增加一个节点

pre = root

pre.nextnode = linkroot

p = linkroot

t = m - 1

while t > 0: # pre 始终记录反转的起始位置的直接前驱

pre = p

p = p.nextnode # 始终保持指向反转的起始位置节点

t -= 1

cur = p # cur记录每次头插法的点

q = p.nextnode # q记录反转区间中的点

for _ in range(m + 1, n + 1): # 从反转起始的下一个点开始头插法

if q is not None:

r = q.nextnode # r记录q的直接后继节点

pre.nextnode = q

q.nextnode = cur

p.nextnode = r

cur = q

q = r

return root.nextnode

if __name__ == '__main__':

"""1->2->3->4->5->6->7->8->9 to 1->6->5->4->3->2->7->8->9"""

roota = LinkNode(1)

pp = roota

for i in range(2, 10):

qq = LinkNode(i)

pp.nextnode = qq

pp = pp.nextnode

root = Solution().reverse_between(roota, 2, 6)

while root is not None:

print root.val,

root = root.nextnode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值