链表的实现--代码演示

# 节点类,链表节点类分为data与next域
class Node:
    def __init__(self,data):
        self.data = data
        self.next = None

# 单链表头节点
class SingleLinkList:
    def __init__(self):
        self._head = None

    def add(self,data):
        # 添加新节点
        new_node = Node(data)
        # 先处理新节点
        new_node.next = self._head
        # 再处理老节点
        self._head = new_node

    def travel(self):
        # 对头结点进行备份
        tmp = self._head
        # 判断头结点是否指向有节点
        while tmp:
            # 打印指向节点的data数据域
            print(tmp.data,end=" ")
            # 获取下一节点
            tmp = tmp.next
            # 循环获取所有节点,直到最后一个节点,最后一个节点指向None,此时跳出循环
        print()

    def is_empty(self):
        # 链表是否为空
        return self._head is None

    def length(self):
        # 链表的长度
        count = 0
        tmp = self._head
        while tmp:
            count += 1
            tmp = tmp.next
        return count

    def append(self,data):
        # 在尾部追加节点
        tmp = self._head
        if tmp is None:
            self.add(data)
        else:
            # 如果有下一个节点
            while tmp.next:
                tmp = tmp.next
            new_node = Node(data)
            new_node.next = tmp.next
            tmp.next = new_node
    

    def insert(self,pos,data):
        count = 0
        if pos <= 0:
            self.add(data)
        else:
            tmp = self._head
            # 查找到索引所在的节点的上一个元素
            while count < pos-1 and tmp.next:
                tmp = tmp.next
                count +=1
            new_node = Node(data)
            new_node.next = tmp.next
            tmp.next = new_node
    

    def remove(self,data):
        # 删除节点
        tmp = self._head
        if tmp is None:
            return
        # 第一个节点就是要删除的节点
        if tmp.data == data:
            old = tmp
            self._head = old.next
            old.next = None
            return
        # 删除其他节点
        while tmp.next.data != data:
            tmp = tmp.next
        old = tmp.next
        # tmp.next = tmp.next.next
        tmp.next = old.next
        # 将删除的节点的next清空
        old.next = None
        
        
    def reverse(self):
        # 倒置
        tmp = self._head
        if tmp is None:
            return
        else:
            # 备份
            bak = tmp
            # 循环拿到下一个节点
            while bak.next:
                bak = bak.next 
                if bak.data:
                    # 将获取的节点从头加进去
                    self.add(bak.data)
            tmp.next = None

def test():
    mynode = SingleLinkList()
    mynode.append(2)
    mynode.append(3)
    mynode.append(4)
    mynode.append(5)
    mynode.reverse()
    # mynode.remove(5)
    # mynode.remove(2) 

    mynode.travel()
    

if __name__ == "__main__":
    test()

猜你喜欢

转载自blog.csdn.net/weixin_43958804/article/details/87922633