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()

原文地址:https://www.cnblogs.com/Doner/p/11547958.html