题目描述:
输入一个单链表:1,2,3,4,5,6
输入指定反转的节点起始位置m和结束位置n:3,5
输出反转后的链表:1,2,5,4,3,6
代码实现:
1. 定义节点Node,Node包含一个值域 item 保存每个节点的数值,和一个指针域 next 保存下一个节点的地址
class Node:
def __init__(self,item):
self.item = item
self.next = None
2. 定义单链表,SingleLinkedList包含一个头节点 head 和size
class SingleLinkedList:
# 初始化
def __init__(self):
self.head = None
self.size = 0
2.1 实现给单链表添加元素,提供三种添加方法:1)在头节点添加;2)在指定位置添加;3)在尾节点添加
# 在头节点添加
def add(self,item):
node = Node(item)
node.next = self.head
self.head = node
self.size = self.size + 1
# 在指定位置添加
def insert(self,item,index):
if index > self.size or index < 1:
print("index out of list!, 0 < index < " + str(self.size))
else:
node = Node(item)
cur = self.head
i = 1
while i < index:
i = i + 1
cur = cur.next
nex = cur.next
cur.next = node
node.next = nex
self.size = self.size + 1
# 在尾节点添加
def append(self, item):
if not self.head:
self.add(item)
else:
cur = self.head
while cur.next:
cur = cur.next
cur.next = Node(item)
self.size = self.size + 1
2.2 实现单链表第m到第n个节点反转,提供两种反转方法:1)逐次反转当前节点的指针域指向前一节点;2)递归实现
2.2.1 思路图解:
代码实现
class SingleLinkedList:
# 指定位置段的节点反转
def inverse(self,m,n):
if m < 1 or n > self.size:
print("index out of list!, 0 < m,n < " + str(self.size))
else:
if m == n:
return
if m > n:
temp = n
n = m
m = temp
# 方法一,逐次反转两个节点前保留后一个节点
print("method 1")
cur = self.head
pre = None
i = 1
while i < m:
pre = cur
cur = cur.next
i = i + 1
node_m_1 = pre
node_m = cur
nex = cur.next
while i < n:
pre = cur
cur = nex
nex = cur.next
cur.next = pre
i = i + 1
if node_m_1 != None:
node_m_1.next = cur
else:
self.head = cur # m=1时
node_m.next = nex
2.2.2 思路图解
代码实现:
class SingleLinkedList:
# 指定位置段的节点反转
def inverse(self,m,n):
if m < 1 or n > self.size:
print("index out of list!, 0 < m,n < " + str(self.size))
else:
if m == n:
return
if m > n:
temp = n
n = m
m = temp
# 方法二,递归反转
print("method 2")
cur = self.head
pre = None
i = 1
while i < m:
pre = cur
cur = cur.next
i = i + 1
node_m_1 = pre
node_m = cur
while i < n:
cur = cur.next
i = i + 1
node_n = cur
nex = cur.next
SingleLinkedList.recursiveinverse(node_m,node_n)
if node_m_1 != None:
node_m_1.next = node_n
else:
self.head = node_n
node_m.next = nex
# 递归反转
def recursiveinverse(head,tail):
if head != tail:
newhead = head.next
SingleLinkedList.recursiveinverse(newhead,tail)
newhead.next = head
3. 遍历单链表输出
class SingleLinkedList:
# 遍历链表
def display(self):
if self.size == 0:
print('None')
else:
cur = self.head
print(cur.item)
while cur.next:
cur = cur.next
print(cur.item)
4.测试
if __name__ == "__main__":
linklist = SingleLinkedList()
for i in range(6):linklist.append(i+1)
linklist.display()
print()
linklist.inverse(3,5)
linklist.display()
runfile('E:/Projects/Projects_python/ListTest.py', wdir='E:/Projects/Projects_python')
1
2
3
4
5
6
method 2
1
2
5
4
3
6
5. 完整源码
https://github.com/Elevenoo/ListTest.git
写在最后:
Elevenoo is a smart and beautiful girl .