链表(二)

2019-10-10  本文已影响0人  小董不太懂
链表的构造:
class Node():
    '''节点'''
    def __init__(self,elem):
        self.elem = elem
        self.next = None

class SingleLinkList(object):
    '''单链表'''
    def __init__(self,node=None):
        #内部私有函数,链表头的初始化,可以直接建立空链表
        self.__head = node

    def is_empty(self):
        """判断链表是否为空"""
        pass

    def length(self):
        """返回链表的长度"""
        pass

    def travel(self):
        """遍历链表"""
        pass

    def add(self, item):
        """头部添加节点"""
        pass

    def append(self, item):
        """尾部添加节点"""
        pass

    def insert(self, pos, item):
        """在指定位置添加节点"""
        pass

    def remove(self, item):
        """删除一个节点"""
        pass

    def search(self, item):
        """查找节点是否存在"""
        pass


single_obj = SingleLinkList()
single_obj.travel()
这部分主要是考虑P节点指向的问题,节点类已经有了;

关于这一点,也可以写成:

 def __init__(self,node):
        #内部私有函数,链表头的初始化,可以直接建立空链表
        self.__head = None
node = Node(100)
single_obj = SingleLinkList(node)

这样也可以就是不太高级。


如图,简写单链接表为sll,因为SingleListLink()传入的值为空,故默认node = None,即__head指向为空,也就是P指向为None。node = Node(100),产生了节点类,节点包括两部分,一部分是elem,一部分是next。下一步就是让__head指向100这个节点。
class Node():
    '''节点'''
    def __init__(self,elem):
        self.elem = elem
        self.next = None

class SingleLinkList(object):
    '''单链表'''
    def __init__(self,node=None):
        #内部私有函数,链表头的初始化,可以直接建立空链表
        self.__head = node

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

    def length(self):
        """返回链表的长度"""
        #cur游标,用来移动遍历节点
        #count,用来记录节点数量
        count = 0
        cur = self.__head
        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

    def add(self, item):
        """头部添加节点"""
        pass

    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.next = node

    def insert(self, pos, item):
        """在指定位置添加节点"""
        pass

    def remove(self, item):
        """删除一个节点"""
        pass

    def search(self, item):
        """查找节点是否存在"""
        pass


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

    li.append(1)
    li.append(2)
    print(li.is_empty())
    print(li.length())

    li.append(3)
    li.append(4)
    li.travel()

测试结果:

True
0
False
2
1 2 3 4
    def insert(self, pos, item):
        """在指定位置添加节点"""
        pre = self.__head
        count = 0
        while count < (pos-1):
            count += 1
            pre = pre.next
        node = Node(item)
        node.next = pre.next
        pre.next = node

这么写是不是很OK,但是还需要考虑特殊情况,如果用户输入的pos =< 0怎么办,我们只能默认是0,故采用头插法。如果大于等于链表的总长度,那就是尾插法了。

    def insert(self, pos, item):
        """在指定位置添加节点"""
        pre = self.__head
        count = 0
        if pos <= 0:
            self.add(item)
        elif pos >= (self.length()-1):
            self.append(item)
        else:
            while count < (pos-1):
                count += 1
                pre = pre.next
            node = Node(item)
            node.next = pre.next
            pre.next = node
这么一来就很清晰了,测试结果也不存在问题。

完整代码如下:

class Node():
    '''节点'''
    def __init__(self,elem):
        self.elem = elem
        self.next = None

class SingleLinkList(object):
    '''单链表'''
    def __init__(self,node=None):
        #内部私有函数,链表头的初始化,可以直接建立空链表
        self.__head = node

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

    def length(self):
        """返回链表的长度"""
        #cur游标,用来移动遍历节点
        #count,用来记录节点数量
        count = 0
        cur = self.__head
        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

    def add(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.next = node

    def insert(self, pos, item):
        """在指定位置添加节点"""
        pre = self.__head
        count = 0
        if pos <= 0:
            self.add(item)
        elif pos >= (self.length()-1):
            self.append(item)
        else:
            while count < (pos-1):
                count += 1
                pre = pre.next
            node = Node(item)
            node.next = pre.next
            pre.next = node

    def remove(self, item):
        """删除一个节点"""
        cur = self.__head
        pre = None
        while cur != None:
            if cur.elem == item:
                #先判断是否为头节点,然后再去处理头节点
                if cur == self.__head:
                    self.__head = cur.next
                else:
                    pre.next = cur.next
                break
            else:
                pre = cur
                cur = cur.next


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



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

    li.append(1)
    li.append(2)
    print(li.is_empty())
    print(li.length())

    li.append(3)
    li.append(4)
    li.add(10)
    li.add(20)
    li.insert(2,30)
    li.insert(10,1000)
    li.insert(0,999)
    li.travel()
    print()
    print(li.search(20))
    print(li.search(123))
    li.travel()
    li.remove(999)
    li.travel()
    li.remove(1000)
    li.travel()
    li.remove(30)
    li.travel()

上一篇 下一篇

猜你喜欢

热点阅读