python-实现单链表

# encoding=utf-8


class Node(object):
    """节点类"""
    def __init__(self, item):
        """
        初始化函数
        :param item:  要保存的用户数据
        """
        self.item = item
        self.next = None


class SingleLinkList(object):
    """单链表"""
    def __init__(self, node=None):
        """
        初始化函数r
        :param node: 可传可不传的头节点
        """
        # 指向头节点
        self.__head = node

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

    def length(self):
        """链表长度"""
        current = self.__head
        count = 0
        while current is not None:
            count += 1
            current = current.next

        return count

    def travel(self):
        """遍历整个链表 要考虑空链表如果是空链表判断条件不成立也就不输出任何信息"""
        current = self.__head
        while current is not None:
            print(current.item, end="")
            current = current.next

        print("")  # 多输出换行

    def add(self, item):
        """"在链表头部插入元素"""
        node = Node(item)
        node.next = self.__head
        self.__head = node

    def append(self, item):
        """"在链表尾部插入节点"""
        node = Node(item)
        cur = self.__head
        if cur is None:
            self.add(item)
            return
        while cur.next is not None:
            cur = cur.next

        cur.next = node

    def insert(self, pos, item):
        """指定位置添加元素"""
        # 在头结点插入元素
        if pos <=0:
            self.add(item)
        # 在链表的尾部添加元素
        elif pos >= self.length():
            self.append(item)

        # 在链表的任意位置添加元素

        else:
            cur = self.__head
            count = 0
            # 找到添加位置的前一个位置
            while count < (pos-1):
                count += 1
                cur = cur.next
            node = Node(item)
            node.next = cur.next
            cur.next = node

    def remove(self, item):
        """
        删除节点
        :param item: 要删除的元素
        :return:
        """

        cur = self.__head
        pre = None
        while cur is not None:
            # 找到了元素
            if cur.item == item:
                # 在头部找到了元素
                if cur == self.__head:
                    self.__head = cur.next
                else:
                    pre.next = cur.next
                return
            pre = cur
            cur = cur.next


    def search(self, item):
        """
        查找节点是否存在
        :param item: 要查找的element
        :return:
        """
        cur = self.__head

        while cur is not None:
            if cur.item == item:
                return True
            cur = cur.next

        return False



if __name__ == '__main__':
    ll = SingleLinkList()
    print(ll.length())

    ll.append(1)   # 1
    print(ll.length())
    ll.travel()

    ll.append(2)   #1 2
    print(ll.length())
    ll.travel()

    ll.add(3)   # 3 1 2
    ll.travel()

    ll.add(4) # 4 3 1 2
    ll.travel()

    ll.insert(0, 5)  # 5 4 3 1 2
    ll.travel()

    ll.insert(10, 6)  # 5 4 3 1 2  6
    ll.travel()

    ll.insert(3, 7)  # 5 4 3  7 1 2  6
    ll.travel()

    ll.remove(5)  #  4 3  7 1 2  6)
    ll.travel()

    ll.remove(6)  #  4 3  7 1 2
    ll.travel()

    ll.remove(7)  #  4 3  1 2
    ll.travel()

    ll.remove(4)  #  3  1 2
    ll.travel()
    ll.remove(3)  #   1 2
    ll.travel()
    ll.remove(1)  #  2
    ll.travel()
    ll.remove(2)
    ll.travel()
  
原文地址:https://www.cnblogs.com/wgDream/p/7513662.html