zoukankan      html  css  js  c++  java
  • python 实现单链表

    数据结构是计算机存储、组织数据的方式,结构不同那么数据的检索方式和效率都不一样

    常用的数据结构有  数组 、栈 、队列 、链表 、树、堆

    今天讲下单链表,单链表是一种链式存取的数据结构, 跟顺序链表完全部一样 是一种非顺序结构存储

    单链表是结点表示数据,结点包括数据和后继元素构成(用来存放下一个节点的位置)

    链表的缺点失去顺序表读取的优点,增加了结点的地址,空间开销比较大,但比顺序存储空间的使用要相对灵活

    链表主要操作主要是遍历操作,效率降低

    单链表的表现形式,这种结构不像顺序结构连续存储,是一种非连续,非顺序的存储结构  例如以下

    单链表代码实现

     1 class Node(object):
     2     def __init__(self,elem):
     3         self.elem = elem
     4         self.next = None
     5 
     6 class SingleLinkList(object):
     7     """单向列表"""
     8     def __init__(self):
     9         self.__head = None
    10 
    11     def is_empty(self):
    12         return self.__head is None
    13 
    14     def get_length(self):
    15         """遍历整个列表"""
    16         curr_node = self.__head
    17         count = 0
    18         while curr_node.next is not None:
    19             count += 1
    20             curr_node = curr_node.next
    21         count += 1
    22         return count
    23 
    24     def add(self,item):
    25         """头部添加"""
    26         node = Node(item)
    27         node.next = self.__head
    28         self.__head = node
    29 
    30     def append(self,item):
    31         node = Node(item)
    32         if self.is_empty():
    33             self.__head = node
    34         else:
    35             curr_node = self.__head
    36             while curr_node.next is not None:
    37                 curr_node = curr_node.next
    38             curr_node.next = node
    39 
    40     def insert(self,pos,item):
    41         if pos <=0:
    42             self.add(item)
    43         elif pos >(self.length()-1):
    44             self.append(item)
    45         else:
    46             pre = self.__head
    47             count = 0
    48             while count < (pos-1):
    49                 count +=1
    50                 pre = pre.next
    51             #循环退出后 pre指向pos-1
    52             node = Node(item)
    53             node.next = pre.next
    54             pre.next = node
    55 
    56     def remove(self,item):
    57         """删除数据"""
    58         curr_node = self.__head
    59         pre = None
    60         while curr_node is not None:
    61             if curr_node.elem == item:
    62                 #先判断是否是头结点
    63                 if curr_node == self.__head:
    64                     self.__head = curr_node.next
    65                 else:
    66                     pre.next = curr_node.next
    67                 break
    68             else:
    69                 pre = curr_node
    70                 curr_node = curr_node.next
    71 
    72     def elem_travel(self):
    73         """遍历整个列表"""
    74         if self.is_empty():
    75             return None
    76         curr_node = self.__head
    77         while curr_node.next is not None:
    78             print(curr_node.elem, " ")
    79             curr_node = curr_node.next
    80         print(curr_node.elem, " ")
    81 
    82 if __name__ == "__main__":
    83     linkList = SingleLinkList()
    84     print("当前链表是否为空:",linkList.is_empty())    #True
    85     linkList.add(9)
    86     linkList.add(12)
    87     linkList.append(4)
    88     linkList.append(8)
    89     print("当前链表是否为空:", linkList.is_empty())  # False
    90     print("当前链表长度:",linkList.get_length()) # 4
    91     linkList.remove(4)
    92     print("当前链表长度:", linkList.get_length()) # 3
    93     print("当前链表数据:")
    94     linkList.elem_travel()  # 9 12 8

    运行结果:

  • 相关阅读:
    C++字节对齐与位域
    使用GDB调试将符号表与程序分离后的可执行文件
    在windows上编译apr库
    使用samba共享文件夹,提供给window访问
    Linux常用命令
    使用VS2015编译xlslib库
    VS资源收藏<持续更新中>
    使用Visual Studio 2017 C++17模块(module)特性
    RMAN中format的参数
    C#的Process类的一些用法
  • 原文地址:https://www.cnblogs.com/zz-952/p/10463181.html
Copyright © 2011-2022 走看看