链表翻转 示例:
给定一个链表,翻转该链表从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 #linkList是最终的,整体链表,pNode这是他的一个指针的构建部分
# 尾插法
for i in range(1, size + 1):
node = SNode() #先将它转化为链表的形式,再将它赋值给pNode
node.Value = i
pNode.Next = node
pNode = pNode.Next #这个一步是为了一层层的推/后移
return linkList
# 创建带头结点的链表(假如输入的是值,需要使用input_str.split(),将输入转化为List,再进行求解)
def createLinkList(list_input):
if len(list_input)<= 0:
return None
linkList = SNode()
pNode = linkList
# 尾插法
for i in list_input:
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
---------------------
作者:RealEmperor
来源:CSDN
原文:https://blog.csdn.net/weixin_42018258/article/details/80572107
版权声明:本文为博主原创文章,转载请附上博文链接!