Python数据结构3——链表

Python数据结构3——链表

Python数据结构3——链表_第1张图片

单向链表

Python数据结构3——链表_第2张图片

Python独特的语法特性,保存对象的地址。
Python数据结构3——链表_第3张图片
None是一个对象,而NULL是一个类型。
与c++不同,Python中没有NULL,只有None,None有自己的特殊类型NoneType。None不等于0、任何空字符串、False等。在Python中,None、False、0、“”(空字符串)、、()(空元组)、{}(空字典)都相当于False。

节点:
链表是由节点组成的:

class Node(object):
    '单链表的节点'
    def __init__(self,item):
        #item存放数据元素
        self.item=item
        #next是下一个节点的标识
        self.next=None

对于链表,要能够满足:
Python数据结构3——链表_第4张图片
单链表实现:

#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: 83788
@file: mypro3.py
@time: 2022/09/08
@desc:
"""
class Node(object):
    '单链表的节点'
    def __init__(self,item):
        #item存放数据元素
        self.item=item
        #next是下一个节点的标识
        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游标,用来移动遍历节点
        cur = self.__head
        # count记录数量
        count = 0
        while cur != None:
            cur = cur.next
            count += 1
        return count

    def travel(self):
        '遍历单链表'
        #cur游标,用来移动遍历节点
        cur=self.__head
        while cur!=None:
            print(cur.item,end=' ')
            cur=cur.next
        print()
    def add(self,item):
        '单链表头部添加元素'
        node = Node(item)
        node.next=self.__head
        #上式表示把head指向的节点赋值给node
        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):
        '''单链表指定位置添加元素
        :param pos 从0开始
        '''
        node = Node(item)
        pre=self.__head
        if pos<=0:
            self.add(item)
        elif pos>self.length()-1:
            self.append(item)
        else :
            count = 0
            while count<(pos-1):
                count+=1
                pre=pre.next
            node.next=pre.next
            pre.next=node



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

    def remove(self,item):
        '删除节点'

        while self.search(item)==True:
            pre = None
            cur = self.__head
            while cur!=None:
                if cur.item==item:
                    #先判断此节点是不是头节点
                    if (pre==None):
                        self.__head=cur.next
                    else:
                        pre.next=cur.next
                    break
                else:
                    pre=cur
                    cur=cur.next
        return('结束')


if __name__=='__main__':
    ll=SingleLinkList()
    ll.append(1)
    ll.append(2)
    ll.append(2)
    ll.append(4)
    ll.append(2)
    ll.add(2)
    ll.insert(-1,100)
    ll.travel()
    ll.remove(2)
    ll.travel()

Python数据结构3——链表_第5张图片

单链表与顺序表对比

Python数据结构3——链表_第6张图片

双向链表

节点的定义:

class Node(object):
    '单链表的节点'
    def __init__(self,item):
        self.item=item
        self.prev=None
        self.next=None

Python数据结构3——链表_第7张图片

双链表的实现:(使用继承方法)

#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: 83788
@file: mypro4-shuang.py
@time: 2022/09/09
@desc:
"""
from mypro3 import SingleLinkList

class Node(object):
    '单链表的节点'
    def __init__(self,item):
        self.item=item
        self.prev=None
        self.next=None

class DoubleLinkList(SingleLinkList):

    def add(self,item):
        '单链表头部添加元素'
        node = Node(item)
        node.next=self.__head
        self.__head = node
        node.next.prev=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
            node.prev=cur
            cur.next=node

    def insert(self,pos,item):
        '''单链表指定位置添加元素
        :param pos 从0开始
        '''
        node = Node(item)
        cur=self.__head
        if pos<=0:
            self.add(item)
        elif pos>self.length()-1:
            self.append(item)
        else :
            count = 0
            while count<(pos):
                count+=1
                cur=cur.next
            node.next=cur
            node.prev=cur.prev
            cur.prev.next=node
            cur.prev=node

    def remove(self,item):
        '删除节点'

        while self.search(item)==True:
            cur = self.__head
            while cur!=None:
                if cur.item==item:
                    #先判断此节点是不是头节点
                    if (cur==self.__head):
                        self.__head=cur.next
                        if cur.next:
                            #判断链表是否只有一个节点
                            cur.next.prev=None
                    else:
                        cur.prev.next=cur.next
                        if cur.next:
                            cur.next.prev=cur.prev
                    break
                else:
                    cur=cur.next
        return('结束')

if __name__=='__main__':
    ll=SingleLinkList()
    ll.append(1)
    ll.append(2)
    ll.append(2)
    ll.append(4)
    ll.append(2)
    ll.add(2)
    ll.insert(-1,100)
    ll.travel()
    ll.remove(2)
    ll.travel()

Python数据结构3——链表_第8张图片

你可能感兴趣的:(数据结构,链表,数据结构,python,学习)