天天看点

python数据结构Python与数据结构二、链表

Python与数据结构

一、顺序表

python数据结构Python与数据结构二、链表
  • 存储位置 L O C ( a i + 1 ) LOC(a_{i+1}) LOC(ai+1​)和第i个数据元素的存储位置为 L O C ( a i ) LOC(a_i) LOC(ai​)之间满足下列关系

    L O C ( a a + 1 ) = L O C ( a i ) + l LOC(a_{a+1}) = LOC(a_i)+l LOC(aa+1​)=LOC(ai​)+l

  • 线性表的第 i i i个数据元素 a i a_i ai​的存储位置为

L O C ( a i ) = L O C ( a 1 ) + ( i − 1 ) ∗ l LOC(a_i) = LOC(a_1)+(i-1)*l LOC(ai​)=LOC(a1​)+(i−1)∗l

python数据结构Python与数据结构二、链表
  • 尾端加入元素,时间复杂度为O(1)
  • 非保序的加入元素(不常见),O(1)
  • 保序的元素加入,时间复杂度为O(n)
python数据结构Python与数据结构二、链表
python数据结构Python与数据结构二、链表
  • 顺序表元素外置,存储表的地址,然后再找到存储的数据
  • python中顺序表 是用操作append,pop等
  • python数据结构Python与数据结构二、链表
    python数据结构Python与数据结构二、链表

二、链表

python数据结构Python与数据结构二、链表

2.1 单向链表

python数据结构Python与数据结构二、链表

产生数据结构,定义为类

python数据结构Python与数据结构二、链表
  • 定义结点类
class Node(object):
    """
    建立结点类
    """
    def __init__(self,elem):
        self.elem = elem
        self.next = None
        # 初始为空值
           
  • 定义单链表类
class SingleLinkList(object):
    """单链表"""
    def __init__(self,node=None):
        """
        指向头结点,默认为空值
        :param node:
        """
        self.__head = node
    def is_empty(self):
        """链表是否为空"""
        return self.__head == None
    def length(self):
        """链表长度"""
        # cur 指针用来移动遍历结点
        cur = self.__head
        # count 记录数量
        count = 0 # count初始化为0
        while cur != None:
            count += 1
            cur = cur.next
            # count = 1
            # cur.next != None
        return count

    def travel(self):
        """遍历整个链表"""
        cur = self.__head
        while cur != None:
            print(cur.elem,end = " ")
            cur = cur.next
        print("\t")

    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):
        """指定位置添加元素
        :param pos from 0
        """
        if pos<=0:
            self.add(item)
        elif pos>(self.length()-1):
            self.append(item)
        else:
            pre = self.__head
            count = 0
            while count< pos-1:
                pre = pre.next
                count += 1
            # 当循环结束后,pre指向pos-1位置
            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
                    break
                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
           
python数据结构Python与数据结构二、链表
class Node(object):
    """
    建立结点类
    """
    def __init__(self,elem):
        self.elem = elem
        self.next = None

class SingleLinkList(object):
    """单链表"""
    def __init__(self,node=None):
        """
        指向头结点,默认为空值
        :param node:
        """
        self.__head = node
    def is_empty(self):
        """链表是否为空"""
        return self.__head == None
    def length(self):
        """链表长度"""
        # cur 指针用来移动遍历结点
        cur = self.__head
        # count 记录数量
        count = 0 # count初始化为0
        while cur != None:
            count += 1
            cur = cur.next
            # count = 1
            # cur.next != None
        return count

    def travel(self):
        """遍历整个链表"""
        cur = self.__head
        while cur != None:
            print(cur.elem,end = " ")
            cur = cur.next
        print("\t")

    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):
        """指定位置添加元素
        :param pos from 0
        """
        if pos<=0:
            self.add(item)
        elif pos>(self.length()-1):
            self.append(item)
        else:
            pre = self.__head
            count = 0
            while count< pos-1:
                pre = pre.next
                count += 1
            # 当循环结束后,pre指向pos-1位置
            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
                    break
                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



# node = Node(100)

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

    ll.append(10)
    print(ll.is_empty())
    print(ll.length())

    ll.append(2)
    ll.append(3)
    ll.append(4)
    ll.append(5)
    ll.append(6)
    ll.add(100)
    ll.insert(-1,9)
    ll.insert(2,1000)
    ll.insert(10,10000)
    ll.travel()
    ll.remove(100)
    ll.travel()
    ll.remove(10000)
    ll.travel()
           
python数据结构Python与数据结构二、链表
python数据结构Python与数据结构二、链表

2.2 双向链表

python数据结构Python与数据结构二、链表
python数据结构Python与数据结构二、链表
class Node(object):
    """
    结点
    """
    def __init__(self,item):
        self.elem = item
        self.next = None
        self.prev = None

class DoubleLinkList(object):
    """双链表"""
    def __init__(self,node=None):
        """
        指向头结点,默认为空值
        :param node:
        """
        self.__head = node
    def is_empty(self):
        """链表是否为空"""
        return self.__head is None
    def length(self):
        """链表长度"""
        # cur 指针用来移动遍历结点
        cur = self.__head
        # count 记录数量
        count = 0 # count初始化为0
        while cur != None:
            count += 1
            cur = cur.next
            # count = 1
            # cur.next != None
        return count

    def travel(self):
        """遍历整个链表"""
        cur = self.__head
        while cur != None:
            print(cur.elem,end = " ")
            cur = cur.next
        print("\t")
    # 以上和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
            cur.next = node
            node.prev = cur


    def insert(self,pos,item):
        """指定位置添加元素
        :param pos from 0
        """
        if pos<=0:
            self.add(item)
        elif pos>(self.length()-1):
            self.append(item)
        else:
            cur = self.__head
            count = 0
            while count< pos:
                cur = cur.next
                count += 1
            # 当循环结束后,cur指向pos位置
            node = Node(item)
            node.next = cur
            node.prev = cur.prev
            cur.prev.next = node
            cur.prev = node

    def remove(self,item):
        """删除节点"""
        cur  = self.__head
        while cur != None:
            if cur.elem == item:
                # 先判断此结点是否为头结点
                # 头结点:
                if cur == self.__head:
                    self.__head = cur.next
                    if cur.next:
                        # 判断链表是否只有一个结点
                        cur.next.prev = None
                    cur.next.prev = None
                else:
                    cur.prev.next = cur.next
                    if cur.next:
                        cur.next.prev = cur.prev
                break
            else:
                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__":
    ll = DoubleLinkList()

    print(ll.is_empty())
    print(ll.length())

    ll.append(10)
    print(ll.is_empty())
    print(ll.length())

    ll.append(2)
    ll.append(3)
    ll.append(4)
    ll.append(5)
    ll.append(6)
    ll.add(100)
    ll.insert(-1,9)
    ll.insert(2,1000)
    ll.insert(10,10000)
    ll.travel()
    ll.remove(100)
    ll.travel()
    ll.remove(10000)
    ll.travel()
           
python数据结构Python与数据结构二、链表

2.3 单向循环链表

# -*- coding:utf-8 -*-
# Author : XuQiao

class Node(object):
    """
    建立结点类
    """
    def __init__(self,elem):
        self.elem = elem
        self.next = None

class SingleCycleLinkList(object):
    """单向循环链表"""
    def __init__(self,node=None):
        """
        指向头结点,默认为空值
        :param node:
        """
        self.__head = node
        if node:
            node.next = node

    def is_empty(self):
        """链表是否为空"""
        return self.__head == None
    def length(self):
        """链表长度"""
        if self.is_empty():
            return 0
        # cur 指针用来移动遍历结点
        cur = self.__head
        # count 记录数量
        count = 1
        while cur.next != self.__head:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        """遍历整个链表"""
        if self.is_empty():
            return
        cur = self.__head
        while cur.next != self.__head:
            print(cur.elem)
            cur = cur.next
        # 退出循环,cur指向尾结点,但尾结点的元素未打印
        print(cur.elem,end=" ")
        print("\t")


    def add(self,item):
        """链表头部添加元素,头插法"""
        node = Node(item)
        if self.is_empty():
            self.__head = node
            self.__head.next = self.__head
            return
        cur = self.__head
        while cur.next != self.__head:
            cur = cur.next
        node.next = self.__head
        self.__head = node
        cur.next = self.__head

    def append(self,item):
        """链表尾部添加元素,尾插法"""
        node = Node(item)
        cur = self.__head
        if self.is_empty():
            self.__head = node
            self.__head.next = self.__head
            return
        while cur.next != self.__head:
            cur = cur.next
        node.next = cur.next
        cur.next = node

    def insert(self,pos,item):
        """指定位置添加元素
        :param pos from 0
        """
        if pos<=0:
            self.add(item)
        elif pos>(self.length()-1):
            self.append(item)
        else:
            pre = self.__head
            count = 0
            while count< pos-1:
                pre = pre.next
                count += 1
            # 当循环结束后,pre指向pos-1位置
            node = Node(item)
            node.next = pre.next
            pre.next = node

    def remove(self,item):
        """删除节点"""
        if self.is_empty():
            return
        cur  = self.__head
        pre = None
        while cur.next != self.__head:
            if cur.elem == item:
                # 先判断此结点是否为头结点
                # 头结点:
                if cur == self.__head:
                    # 头结点的情况
                    # 找尾结点
                    rear = self.__head
                    while rear.next != self.__head:
                        rear = rear.next
                    self.__head = cur.next
                    rear.next = self.__head

                    # self.__head = cur.next
                else: # 中间结点
                    pre.next = cur.next
                return
            else:
                pre = cur
                cur = cur.next
        # 退出循环,cur指向尾结点
        if  cur.elem == item:
            if cur == self.__head:
                # 链表只有一个结点
                self.__head = None
            else:
                pre.next = cur.next

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



# node = Node(100)

if __name__ == "__main__":
    ll = SingleCycleLinkList()
    print(ll.is_empty())
    print(ll.length())

    ll.append(10)
    print(ll.is_empty())
    print(ll.length())

    ll.append(2)
    ll.append(3)
    ll.append(4)
    ll.append(5)
    ll.append(6)
    ll.add(100)
    ll.insert(-1,9)
    ll.insert(2,1000)
    ll.insert(10,10000)
    ll.travel()
    ll.remove(100)
    ll.travel()
    ll.remove(10000)
    ll.travel()