• 基于python实现单链表代码 Marathon


      1 """
      2 linklist.py
      3 单链表的构建与功能操作
      4 重点代码
      5 """
      6 
      7 class Node:
      8     """
      9     思路:将自定义的类视为节点的生成类,
     10             实例对象中包含数据的部分和下一个节点的next
     11     """
     12     def __init__(self,val,next = None):
     13         self.val =  val # 有用数据
     14         self.next = next # 循环下一个节点的关系
     15 
     16 # node1 = Node(1)
     17 # node2 = Node(2,node1)
     18 # node3 = Node(3,node2)
     19 
     20 class LinkList:
     21     """
     22     思路:单链表类,生成对象可以进行增删改查操作
     23             具体操作通过调用具体方法完成
     24     """
     25     def __init__(self):
     26         """
     27         初始化链表,标记一个链表的开端,以便于获取后续的值
     28         """
     29         self.head = Node(None) # 定义开端
     30     # 通过为list_为链表添加一组节点
     31     def init_list(self,list_):
     32         p = self.head # p 作为移动变量
     33         for item in list_:
     34             p.next = Node(item)
     35             p = p.next
     36 
     37     # 遍历链表
     38     def show(self):
     39         p = self.head.next # 第一个有限节点
     40         while p is not None:
     41             print(p.val)
     42             p = p.next # p 向后移动
     43 
     44     # 判断链表为空
     45     def is_empty(self):
     46         if self.head.next is None:
     47             return True
     48         else:
     49             return False
     50 
     51     # 清空链表 断开head
     52     def clear_linklist(self):
     53         self.head.next = None
     54 
     55     # 增加节点
     56     def add_node(self):
     57         """ 链表不在尾部增加,因为要遍历到尾部
     58 
     59         """
     60         pass
     61 
     62     # 尾部插入节点,比列表插入慢
     63     def insert_end(self,val):
     64         p = self.head
     65         while p.next is not None:
     66             p = p.next
     67             p.next = Node(val)
     68 
     69     # 头部插入,速度快
     70     def insert_head(self,val):
     71         node = Node(val) # 1.新建节点
     72         node.next = self.head.next # 新节点指向原第二节点
     73         self.head.next = node # head 节点
     74 
     75     # 指定插入 难度***
     76     def insert_appoint(self,index,val):
     77         # 注意循环的临界问题,和头部插入类似
     78         p = self.head
     79         for i in range(index):
     80             # 如果index 值过大,退出循环
     81             if p.next is None:
     82                 break
     83             p = p.next
     84         node = Node(val)
     85         node.next = p.next
     86         p.next = node
     87 
     88     # 删除节点 效率比列表快,不需要内存的移动
     89     def delete_node(self,x):
     90         p = self.head
     91         # 结束循环,必定条件有假,先判断是不是none,短路原则
     92         while p.next and p.next.val != x:
     93             p = p.next
     94         if p.next is None:
     95             raise ValueError("x not in linklist")
     96         else:
     97             p.next = p.next.next
     98 
     99     # 获取某个节点的值,传入节点位置,
    100     def get_node(self,index):
    101         if index < 0: # 判断索引值是否有误
    102             raise IndexError("index out of range")
    103         p = self.head.next
    104         for i in range(index):
    105             if p.next is None:
    106                 raise  IndexError("list index out of range")
    107             p = p.next
    108         return p.val
    109 
    110     # 将第二个列表合并到第一个列表中,正序排列
    111     def merge_linklist(list1, list2):
    112         """
    113         p 指向l1-head,q 指向l2-元素2,p.next值和q比较
    114         如果比q小,p向后移动,此时p.next为3,大于2,令中间变量
    115         指向p.next,让p指向q,让q等于中间变量,p向后走指向2,重复
    116         上述操作,不用开辟第三个链表
    117 
    118         :param l1:
    119         :param l2:
    120         :return:
    121         """
    122         p = list1.head  # p指向l1头
    123         q = list2.head.next  # q指向l2的元素2
    124         while p.next is not None:
    125             if p.next.val < q.val:
    126                 p = p.next
    127             else:
    128                 # 前两必须标记,后两可以不按顺序
    129                 tmp = p.next
    130                 p.next = q
    131                 p = p.next
    132                 q = tmp
    133         p.next = q
    134 
    135 #------测试代码-------
    136 #if __name__ == "__main__":
    137 # l = LinkList()
    138 # # l.head.next = Node(1)
    139 # # print(l.head.next.val) # 1
    140 # l.init_list([1,2,3,4,5])
    141 # l.show()
  • 相关阅读:
    PAT甲题题解-1106. Lowest Price in Supply Chain (25)-(dfs计算树的最小层数)
    PAT甲题题解-1105. Spiral Matrix (25)-(模拟顺时针矩阵)
    PAT甲题题解-1102. Invert a Binary Tree (25)-(建树,水题)
    PAT甲题题解-1101. Quick Sort (25)-大水题
    PAT甲级题解-1100. Mars Numbers (20)-字符串处理
    XJOI网上同步训练DAY1 T2
    XJOI网上同步训练DAY1 T1
    BZOJ 1061 志愿者招募
    BZOJ 2432 兔农
    KMP算法总♂结
  • 原文地址:https://www.cnblogs.com/davis12/p/13580376.html
Copyright © 2020-2023  润新知