python 实现单链表

,# python实现单链表

# coding=utf-8
'''
实现单向链表的数据结构
单链表特性:数据结构分为两部分,一部分为数据,另一部分指向下一个数据的地址
'''


class Node(object):
    '''
    实现一个节点类
    '''
    def __init__(self, elem):
        '''
        :param elem: 节点中的元素
        next: 这里指的下一个元素对象的地址,通过该地址可提取下一个节点的数据
        '''
        self.elem = elem
        self.next = None


class SingleLinkList(object):
    '''
    实现一个链表类,具有增删查改功能
    函数中的cur类似于一个游标的作用,可通过cur的移动遍历链表中的对象
    '''
    def __init__(self, node=None):
        '''
        :param node: 指向一个Node的对象
        '''
        self.__head = node

    # 判断链表是否为空
    def is_empty(self):
        return self.__head == None

    # 统计链表长度
    def h_lenght(self):
        cur = self.__head
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

    # 遍历整个链表,输出链表中的所有数据
    def travel(self):
        cur = self.__head
        while cur != None:
            print(cur.elem, end=' ')
            cur = cur.next
        print()

    # 链表头部增加元素
    def add_head(self,item):
        node = Node(item)
        node.next = self.__head
        self.__head = node


    # 链表尾部增加元素
    def append(self, item):
        node = Node(item)
        if self.is_empty():
            self.__head = node
        else:
            cur = self.__head
            while cur.next != None:
                cur = cur.next
            # 这里的目的是将cur指向最后创建的一个对象
            cur.next = node

    # 指定位置增加元素
    def insert(self,pos,item):
        '''
        这里可能需要对头部插入和尾部插入两种情况
        :return:
        '''
        if pos <= 0:
            self.add_head(item)
        elif pos > (self.h_lenght())-1:
            self.append(item)
        else:
            node=Node(item)
            count = 0
            cur = self.__head
            while count < (pos-1):
                count += 1
                cur = cur.next
            node.next = cur.next
            cur.next = node

    # 删除节点
    def remove(self,item):
        cur = self.__head
        tmp = None
        while cur != None:
            # print(tmp)
            if cur.elem==item:
                if cur == self.__head:
                    self.__head = cur.next
                else:
                    tmp.next = cur.next
                return
            else:
                tmp = cur
                cur = cur.next

    # 查找节点是否存在
    def search(self,item):
        cur = self.__head
        while cur.next != None:
            if cur.elem == item:
                return True
            else:
                cur = cur.next
        return False


if __name__ == '__main__':
    # 测试一下
    l = SingleLinkList()
    # 是否为空
    print(l.is_empty())
    # 查看长度
    print(l.h_lenght())
    # 添加元素
    l.append(1)
    l.append(2)
    # # 头部元素添加
    l.add_head(8)
    l.insert(2,5)
    l.insert(3,6)
    l.travel()
    l.remove(5)
    print('删除链表中的5')
    l.travel()
posted @ 2020-07-01 20:44  Missv4you  阅读(200)  评论(0)    收藏  举报