zoukankan      html  css  js  c++  java
  • sjjg

    """
    单链表
    . add(item):链表头部添加元素
    . is_empty():链表是否为空
    . length():链表长度
    . travel():遍历整个链表
    . append(item):链表尾部添加元素
    . insert(pos, item):指定位置添加元素
    . search(item):查找节点是否存在
    . remove(item):删除节点 # 删除的最后的元素
    . pop(): 删除最后一个元素
    """
    class Node:
    def init(self, item):
    self.item = item # 值
    self.next = None # 为了规定最后一个是None

    # def __str__(self):
    #     return f'item:{self.item}'
    

    class Link:
    def init(self):
    # 初始化一个空链表
    self._head = None # ~=地址

    def add(self, item):
        node = Node(item)  # node = 1  l.next = None  l._head = 1       node = 2  l.next = 1  l._head = 2
        node.next = self._head  # a.next = None  self._head = a.node   b.next = a.node   self._head = b.node
        self._head = node  # E10
    
        # if self.next != None:
        #     print('self.next', self.next.item)  # DD8
        # print('self._head', self._head.item)
        # print('self._head.next', self._head.next)
    
    def is_empty(self):
        return self._head == None
    
    def length(self):
        cur = self._head  # 2
        count = 0
        while cur != None:  #
            # print(cur)
            cur = cur.next
            if cur != None:
                # print('cur.item', cur.item)
                pass
            count += 1
        return count    # 因为这里需要多次使用,所以不方便print,而是返回值
    
    def travel(self):
        cur = self._head
        for i in range(self.length()):
            print(cur.item, end=' ')
            cur = cur.next
        print()
    def append(self, item):
        cur = self._head
        pre = None
        node = Node(item)
        for i in range(self.length()):
            pre = cur
            cur = cur.next  # 为什么cur = node 不行呢 per = cur 啊 ?
                             # pre的指向链  而不是 cur了 , 所以cur的指向链是下一个的指向链,不是地址node的
        pre.next = node   # 最后的Node()是写好了关联了None , 所以控制没添加之前的 最后一个就行了
    
    def insert(self, pos, item):
        if pos < 0 or pos > self.length():
            print('insert插入的索引 超出范围了')
            return
        cur = self._head
        pre = None
        node = Node(item)
        for i in range(pos):
            pre = cur   # 上一个
            cur = cur.next  # 现在的
    
        pre.next = node  # 之前的连接等于现在的节点
        node.next = cur.next    # 现在的下一个节点是之前的连接
                        # 现在的链表的
    
    def remove(self, item):
        pre = None
        cur = self._head
        if self._head == None:
            return
        if self._head.item == item:
            self._head = cur.next
            return
        for i in range(self.length()):
            if cur.item == item:
                pre.next = cur.next
                return
            pre = cur
            cur = cur.next  # 现在的
        print('链表中没有此值,无法删除')
    
    def search(self, item):
        pre = None
        cur = self._head
        find = False
    
        for i in range(self.length()):
            if cur.item == item:
                find = True
            pre = cur
            cur = cur.next  # 现在的
        return find
    
    def pop(self):  # 删除最后一个
        if self._head == None or self.length() == 1:
            self._head = None
            return
        cur = self._head   # 1
        pre = None
        for i in range(1, self.length()):  # length = 5
            pre = cur  # 1, 2, 3 ,4
            cur = cur.next  # 2, 3, 4 ,5
        pre.next = None  # 4 后面没了! 也对, 不能循环5 次,就是没变化的
    

    print(Node(2))

    l = Link()
    l.add(1)
    l.add(2)
    l.add(3)
    l.add(4)
    l.travel()

    print(l.add(3))

    print(l.is_empty())

    l.travel()

    print(l.length())

    print(l.length())

    print(l.length())

    l.append(1)
    l.append(2)
    l.append(3)
    l.append(4)

    l.travel()

    print(l.length())

    l.insert(2, 6.5)

    l.insert(-1, 6.5)

    l.remove(9)
    l.travel()

    l.remove(9)
    l.remove(9.4)
    l.remove(3)
    l.remove(1)
    l.remove(6.5)

    l.remove(4)
    l.travel()
    l.travel()
    l.remove(4) # 测试,发现诸多问题, 比如,空了的话,给个判断条件,如果为空了直接返回
    # 比如,删除成功了之后,return 跳出函数不要走别的逻辑了,而break 只是跳出当前循环,所以还是有差别的
    # 基本都是基于for实现,但是实现的细节有所不同,需要测试处理.

    l.pop()

    l.pop()

    l.pop()

    l.pop()

    l.pop()

    l.travel()

    print(l.search(2))

    print(l.search(3))

    for i in range(1, 5):

    print(i)

    '''
    链表的逆置 : 不是,是有了,给他倒过来
    '''

    4 -> 3 -> 2 -> 1 -> None

    4 <- 3 <- 2 <- 1 <- None

    1 -> 2 -> 3 -> 4 -> None

    node = Node(item) # 反过来

    node.per = self._head

    self._botton = node

    反过来, a next -> b a <- b

    class Node2:
    def init(self, item):
    self.item = item
    self.prev = None

    class Link2:
    def init(self):
    self._tail = None

    def add(self, item):
        cur = self._tail
        while cur != None:
            cur = cur.prev
    
        node = Node(item)         # 1 前面是2 2 前面是3 1 在最后那样  None -> 4 -> 3 -> 2 -> 1
        node.prev = self._tail    # 之前的是None 1 -> 2 -> 3 -> 4
        self._tail = node  # 尾 又等于了1, 2 , 3  # 1 之前的是None , 2之前的就化成了1  最后这个是最上面的值
    
    #   prev = None -> 1 -> 2 -> 3 -> 4
    #   tail 是最后添加的值
    def is_empty(self):
        return self._tail == None
    
    def length(self):
        cur = self._tail
        count = 0
        while cur != None:
            count += 1
            cur = cur.prev
        return count
    
    def travel(self):
        cur = self._tail
        for i in range(l2.length()):
            print(cur.item, end=' ')
            cur = cur.prev
    

    l2 = Link2()
    l2.add(1)
    l2.add(2)
    l2.add(3)

    print(l2._tail.item)
    print(l2.length())
    l2.travel()

  • 相关阅读:
    《老男孩》
    java中四种阶乘的计算
    DataOutputStream的乱码问题
    java中飞clone方法
    类反射的简单例子
    PHP: 如何连接oracle数据库进行数据读取
    .NET : 如何读取图片中的元数据信息
    重新审视REST
    PHP 的历史
    Image File Format Specifications {转载}
  • 原文地址:https://www.cnblogs.com/Doner/p/11547958.html
Copyright © 2011-2022 走看看