1. 链表(单链表、循环链表、双链表、循环双链表)的实现

  1.1单链表

    每一个节点由数据区及指向下一节点的指针域组成

    

#coding:utf-8
class SingleLinkedList(object):
    """链表类"""
    __slots__ = ['_head', '_size']

    class _Node(object):
        """节点类"""
        __slots__ = ['data', 'next']
        def __init__(self, data, next):
            self.data = data
            self.next = next

    def __init__(self):
        self._head = None
        self._size = 0

    def is_empty(self):
        """判断链表是否为空"""
        return self._size==0

    @property
    def length(self):
        return self._size

    def insert(self, index: int, data):
        """任意位置数据插入"""
        if index>self._size or index<0:
            raise IndexError("out of index or invalid")
        else:
            cur_node = self._Node(data, None)
            if self.is_empty():
                self._head = cur_node
            else:
                node = self._head
                count = 0
                while node != None:
                    if index==0:
                        cur_node.next = node
                        self._head = cur_node
                        break
                    elif count==index-1 and index!=0:
                        cur_node.next = node.next
                        node.next = cur_node
                        break
                    count += 1
                    node = node.next
            self._size += 1

    def remove(self, index):
        """任意位置数据删除"""
        if index>self._size or index<0:
            raise IndexError("out of index or invalid")
        else:
            if self.is_empty():
                raise Exception("This singleLinkedList is empty")
            else:
                node = self._head
                count = 0
                while node != None:
                    if index==0:
                        self._head = node.next
                        break
                    elif index!=0 and count+1==index:
                        node.next = node.next.next
                        break
                    count += 1
                    node = node.next
            self._size -= 1

    def __str__(self):
        flag = "<-"
        res = ""
        node = self._head
        while node != None:
            if node.next==None:
                res += '['+str(node.data)+']'
            else:
                res += ('['+str(node.data)+']'+flag)
            node = node.next
        return res


if __name__ == '__main__':
    link = SingleLinkedList()
    link.insert(0, 1)
    link.insert(0, 0)
    link.insert(1, 11)
    link.insert(0, 22)
    link.insert(0, 4)
    link.insert(2, 8)   # [4]<-[22]<-[8]<-[0]<-[11]<-[1]
    link.remove(0)  # [22]<-[8]<-[0]<-[11]<-[1]
    link.remove(3)  # [22]<-[8]<-[0]<-[1]
    print(link)

  1.2 循环单链表

   

   循环链表的开始和结束没有特定的概念,其使用场景很丰富,对于一些轮转服务的场景很有效,例如指定某一个节点current,通过设置current = current.next,可以有效地遍历链表中每一个节点。

   

   1.3双向链表

    

    插入和删除操作:

     

2. 栈

  2.1 单链表实现栈:

   使用列表(list)来实现栈相对容易,这里我们使用链表来模拟栈的实现

  

02-13 08:01