【Python】给定一个链表,翻转该链表从m到n的位置。要求直接翻转而非申请新空间

链表翻转 示例:

给定一个链表,翻转该链表从m到n的位置。要求直接翻转而非申请新空间。
如:给定1→2→3→4→5,m=2,n=4,返回1→4→3→2→5。
假定给出的参数满足:1≤m≤n≤链表长度。

Python代码如下:


# 定义节点
class SNode:
    Next = None
    Value = None


# 创建带头结点的链表
def createLinkList(size):
    if size <= 0:
        return None
    linkList = SNode()
    pNode = linkList
    # 尾插法
    for i in range(1, size + 1):
        node = SNode()
        node.Value = i
        pNode.Next = node
        pNode = pNode.Next
    return linkList


# 打印链表
def printLinkList(linkList):
    if linkList == None:
        print('None')
        return
    s = "head"
    node = linkList.Next
    while node != None:
        s = s + "->" + str(node.Value)
        node = node.Next
    print(s)


# 翻转链表从m到n的位置
# 假定给出的参数满足:1≤m≤n≤链表长度,下面就不做参数验证了
def reverseLinkList(linkList, m, n):
    '''
    先找到第m个元素,然后把链表中的第n个元素添加到它前面,重复执行n-m次
    如:给定1→2→3→4→5,m=2,n=4,
    head->1->2->3->4->5
    head->1->4->2->3->5 把4插入到2前面
    head->1->4->3->2->5 把3插入到2前面
    '''

    # 第m个元素的前节点
    preMNode = linkList
    for i in range(m - 1):
        preMNode = preMNode.Next

    for i in range(n - m):
        # 找到第n个节点的前节点
        preNNode = linkList
        for j in range(n - 1):
            preNNode = preNNode.Next
        # 找到第n个节点
        nNode = preNNode.Next
        preNNode.Next = preNNode.Next.Next
        nNode.Next = preMNode.Next
        preMNode.Next = nNode
        preMNode = preMNode.Next
        printLinkList(linkList)


if __name__ == '__main__':
    linkList = createLinkList(10)
    printLinkList(linkList)
    reverseLinkList(linkList, 3, 6)

输出结果:

head->1->2->3->4->5->6->7->8->9->10
head->1->2->6->3->4->5->7->8->9->10
head->1->2->6->5->3->4->7->8->9->10
head->1->2->6->5->4->3->7->8->9->10
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值