zoukankan      html  css  js  c++  java
  • Python链表的实现与使用(单向链表与双向链表)

    参考【易百教程】用Python实现链表及其功能

      1 """
      2 python链表的基本操作:节点、链表、增删改查
      3 """
      4 import sys
      5 
      6 class Node(object):
      7     """
      8     节点类,实例化后的对象用来表示链表中的一个节点
      9     """
     10     def __init__(self, dataval=None):
     11         self.dataval = dataval
     12         self.nextval = None
     13 
     14 
     15 class SLinkedList(object):
     16     """
     17     链表类,用于初始化一个链表,及多链表的一些操作
     18     """
     19     def __init__(self):
     20         self.headval = None
     21 
     22     def listprint(self):
     23         """
     24         打印链表
     25         """
     26         val = self.headval
     27         while val is not None:
     28             print(val.dataval, end=' ')
     29             val = val.nextval
     30         print()
     31 
     32     def insertStart(self, newdata):
     33         """
     34         从链表头插入一个节点
     35         param@newdata: 插入的新节点,为Node类实例对象的dataval
     36         """
     37         newdata = Node(newdata)
     38         newdata.nextval = self.headval
     39         self.headval = newdata
     40 
     41     def insertEnd(self, newdata):
     42         """
     43         从链表尾部插入一个节点
     44         param@newdata: 插入的新节点,为Node类实例对象的dataval
     45         """
     46         newdata = Node(newdata)
     47         if self.headval == None:
     48             self.headval = newdata
     49             return
     50         else:
     51             temp = self.headval
     52             while temp.nextval:
     53                 temp = temp.nextval
     54             temp.nextval = newdata
     55 
     56     def insertBetween(self, node, newdata):
     57         """
     58         在链表的node节点后插入一个新元素
     59         param@node: 链表中的一个节点,新插入的元素将插入其后面
     60         param@newdata: 插入的新节点,为Node类实例对象的dataval
     61         """
     62         if (not node) or node == None:
     63             raise Exception('参数异常!')
     64         else:
     65             newdata = Node(newdata)
     66             newdata.nextval = node.nextval
     67             node.nextval = newdata
     68 
     69     def removeNode(self, node_val):
     70         """
     71         从链表中删除值为node_val的节点
     72         param@node_val: 被删除节点的值,即Node类实例对象的dataval
     73         """
     74         if self.headval == None:
     75             print('链表为空链表!')
     76         else:
     77             if self.headval.nextval == None:
     78                 if self.headval == node_val:
     79                     sefl.headval = None
     80                 else:
     81                     return
     82             else:
     83                 temp = self.headval
     84                 if temp.dataval == node_val:
     85                     self.headval = temp.nextval
     86                 else:
     87                     temp = self.headval
     88                     while temp.nextval:
     89                         if temp.nextval.dataval == node_val:
     90                             temp.nextval = temp.nextval.nextval
     91                             break
     92                         temp = temp.nextval
     93 
     94 
     95 
     96 
     97 
     98 li = SLinkedList()
     99 e1 = Node('one')
    100 e2 = Node('two')
    101 e3 = Node('three')
    102 li.headval = e1 
    103 e1.nextval = e2 
    104 e2.nextval = e3 
    105 li.listprint()

     以上为单向链表一些基本操作的Python实现,接下来也展示一下双向链表的一些简单实现

     1 """
     2 双向链表
     3 """
     4 import sys
     5 import collections
     6 
     7 # 双向链表的节点类
     8 class Node(object):
     9     def __init__(self, data):
    10         self.data = data
    11         self.next = None
    12         self.prev = None
    13 
    14 
    15 # 双向链表类
    16 class DoubleLinkedList(object):
    17     def __init__(self):
    18         self.head = None
    19 
    20     def push(self, newdata):
    21         """
    22         尾插法插入数据,也就是向链表的结尾追加元素
    23         param@newdata: 新插入的数据,为Node类的实例对象的data
    24         """
    25         newdata = Node(newdata)
    26         if self.head == None:
    27             self.head = newdata
    28         elif self.head.next == None:
    29             newdata.next = self.head.next
    30             self.head.next = newdata
    31             newdata.prev = self.head
    32         else:
    33             data = self.head
    34             while data.next:
    35                 data = data.next
    36             newdata.next = data.next
    37             data.next = newdata
    38             newdata.prev = data
    39             
    40     # 正向打印出链表值的函数
    41     def listprint(self):
    42         data = self.head
    43         while data is not None:
    44             print(data.data, end=' ')
    45             data = data.next
    46         print()
    47 
    48     # # 反向打印出链表值的函数
    49     def listprint_2(self):
    50         data = self.head
    51         while data.next:
    52             data = data.next
    53         while data is not None:
    54             print(data.data, end=' ')
    55             data = data.prev
    56         print()
    57 
    58     def insert(self, prev_node, newdata):
    59         """
    60         在链表的一个节点后插入一个节点
    61         param@prev_node: 要插入节点的前一个节点
    62         param@newdata: 插入的节点的值,为Node类实例对象的data
    63         """
    64         newdata = Node(newdata)
    65         if prev_node is None:
    66             return
    67         elif prev_node.next is None:
    68             newdata.next = prev_node.next
    69             prev_node.next = newdata
    70             newdata.prev = prev_node
    71         else:
    72             prev_node.next.prev = newdata
    73             newdata.prev = prev_node
    74             newdata.next = prev_node.next
    75             prev_node.next = newdata
    76         
    77 
    78 
    79 dlist = DoubleLinkedList()
    80 dlist.push('one')
    81 dlist.push('two')
    82 dlist.push('three')
    83 dlist.insert(dlist.head, 'hhh')
    84 dlist.listprint()
    85 dlist.listprint_2()

    暂时到这里

  • 相关阅读:
    boost库学习笔记
    boost::bind时候注意性能问题
    Boost线程库学习笔记
    查看linux硬件信息大全
    WPF选择.NET Framework 4 Client Profile提示找不到名字空间
    实战第一个云程序(转)
    ASP.NET那点不为人知的事(一)
    win7中删除桌面删不掉的IE图标方法
    3D打印机(3D Printers)
    360把加壳的程序都报木马
  • 原文地址:https://www.cnblogs.com/springionic/p/10565703.html
Copyright © 2011-2022 走看看