链表中翻转
程序员文章站
2022-05-28 13:07:27
...
链表中翻转
描述
给定一个单向链表,要求将第m位到第n位(从0开始编号位数)的元素翻转过来。
注1:m和n一定都在链表长度内
注2:待翻转的元素包括第m和n位
输入
两行数据
第一行为链表元素,用空格隔开各个元素
第二行有两个数字,分别是m和n
注:链表元素个数最大为1000
输出
翻转后的链表结果
元素之间用->表示连接方向
输入样例 1
1 2 3 4 5 6 7
2 5
输出样例 1
1->2->6->5->4->3->7
输入样例 2
1 2 3 4 5 6 7
0 1
输出样例 2
2->1->3->4->5->6->7
提示
一定注意各种边界情况
class IntNode(object):
def __init__(self, i, n):
self.item = i
self.next = n
class SLList(object):
def __init__(self, x):
self.__first = IntNode(x, None)
self.__last = self.__first #记录最后一个节点的位置
self.__second_last = None
self.__size = 1
def add_first(self, x):
self.__first = IntNode(x, self.__first)
self.__size += 1
def get_first(self):
return self.__first.item
def add_last(self, x):
self.__second_last = self.__last
self.__last = IntNode(x, None)
self.__second_last.next = self.__last
self.__size += 1
def size(self):
return self.__size
def printList(self): #按格式打印出所有节点
p = self.__first
while p.next is not None:
print(p.item, end="") #end="" 表示不换行
print("->", end="")
p = p.next
print(p.item)
def reverse(self, m, n):
p1 = self.__first
count = 0
while count<m-1:
p1 = p1.next
count += 1
if m==0:
left_tail = None
new_tail = p1
else:
left_tail = p1
p1 = p1.next
new_tail = p1
count += 1
pre = p1
if p1.next is not None:
current = p1.next
p1 = current.next
count += 1
while count<=n:
current.next = pre
pre = current
current = p1
if p1 is not None:
p1 = p1.next
count += 1
if left_tail is not None:
left_tail.next = pre
else:
self.__first = pre
new_tail.next = current
s = input()
s_list = s.split(' ')
start, end = map(int, input().split())
l = SLList(s_list[0]) #第一个节点
for item in s_list[1:]: #将数据存储在链表中
l.add_last(item)
'''
print(start)
print(end)
'''
l.reverse(start, end)
l.printList()