Python单链表实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012219371/article/details/85833451
class Node(object):
    def __init__(self, data):
        self.data = data
        self.next = None

class SingleLinkedList(object):
    def __init__(self):
        # 头节点
        self.node = Node(None)
        # 头指针
        self.head = self.node
        # 链表节点数量
        self.size = 0

    def is_empty(self):
        return True if self.head.next == None else False

    def get_size(self):
        return self.size

    # 头插法
    def add_head(self, data):
        node = Node(data)
        node.next = self.head.next
        self.head.next = node
        self.size+=1

    # 尾插法
    def add_tail(self, data):
        node = Node(data)
        if self.head.next == None:
            self.head.next = node
            self.size+=1
        else:
            current_node = self.head
            while (current_node.next != None):
                current_node = current_node.next
            current_node.next = node
            self.size+=1

    # 指定位置插入元素,position从1开始
    def insert_at_position(self,data,position):
        if position<1 or position>self.size+1:
            raise IndexError('插入位置越界')
        if position==1:
            self.add_head(data)
        elif position==self.size:
            self.add_tail(data)
        else:
            current_node=self.head
            for i in range(1,position):
                current_node=current_node.next
            node=Node(data)
            node.next=current_node.next
            current_node.next=node
            self.size+=1

    # 显示所有元素
    def show_all_data(self):
        current_node = self.head.next
        result=""
        while (current_node != None):
            result+=str(current_node.data)+" "
            current_node = current_node.next
        print(result)

    # 删除第一个元素
    def delete_head(self):
        if self.size==0:
            raise Exception('链表为空,错误操作')
        elif self.size==1:
            self.head.next=None
            self.size-=1
        else:
            self.head.next=self.head.next.next
            self.size-=1

    # 删除最后一个元素
    def delete_tail(self):
        if self.size==0:
            raise Exception('链表为空,错误操作')
        elif self.size==1:
            self.head.next=None
            self.size-=1
        else:
            current_node=self.head
            for i in range(1,self.size):
                if current_node!=None:
                    current_node=current_node.next
            current_node.next=None
            self.size-=1

    # 删除指定位置的元素
    def delete_at_position(self,position):
        if position<1 or position>self.size:
            raise IndexError('删除位置越界')
        elif position==1:
            self.delete_head()
            self.size-=1
        elif position==self.size:
            self.delete_tail()
            self.size-=1
        else:
            current_node=self.head
            for i in range(position-1):
                if current_node!=None:
                    current_node=current_node.next
            current_node.next=current_node.next.next
            self.size-=1

    # 按值查找元素,返回第一个查找到的位置
    def find_node(self,data):
        if self.size==0:
            raise Exception('链表为空')
        current_node=self.head
        index=0
        while current_node.next!=None:
            current_node=current_node.next
            index+=1
            if current_node.data==data:
                break
        return index
        
if __name__ == '__main__':
    sll=SingleLinkedList()
    sll.add_tail(1)
    sll.add_tail(2)
    sll.add_tail(3)
    sll.add_tail(4)
    sll.add_tail(5)
    sll.show_all_data()
    index=sll.find_node(3)
    sll.delete_at_position(index)
    sll.show_all_data()
    sll.insert_at_position(3,3)
    sll.show_all_data()

猜你喜欢

转载自blog.csdn.net/u012219371/article/details/85833451
今日推荐