练习:反转单链表中m到n节点(python实现)

题目描述:

输入一个单链表: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 . 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值