数据结构7-链表(Linked list)
链表是物理存储是离散的,逻辑上是顺序的线性表序列(a linear sequence)。
链表由节点构成,每个节点是单独的对象存在于内存中。
节点(node)=数据域(element:指向对象 )+指针域(link or pointer:指向下一个节点) |
单向链表(SinglyLinked Lists):
一个单向链表一般有链表的长度,有两个特殊的节点Head(必须的)和tail。每个节点包含两个值:当前节点的值和一个指向下一个节点的链接。
时间复杂度1,空间复杂度n。
比如用单向链表实现的栈(stack,FILO)和队列(queue, FIFO)。Python代码:
#Stack(LIFO) implementation by Singly Linked list class LindedStack: ''' LIFO stack implementation using linked list''' class _Node: __slot__ = '_element', '_next'
def __init__(self, element, next): self._element = element self._next = next
#stack functions def __init__(self): self._head = None self._size = 0
def __len__(self): return self._size
def is_empty(self): return self._size == 0
def push(self, e): self._head = self._Node(e, self._head) self._size += 1
def top(self): if self.is_empty(): raise Empty('Stack is empty') return self._head._element
def pop(self): if self.is_empty(): raise Empty('Stack is empty') topElement = self._head._element self._head = self._head._next self._size -= 1 return topElement |
#Queue(FIFO) implementation by Singly Linked list class LinkedQueue: ''' FIFO Queue implementation using linked list''' class _Node: __slot__ = '_element', '_next'
def __init__(self, element, next): self._element = element self._next = next
#Queue functions def __init__(self): self._head = None self._tail = None self._size = 0
def __len__(self): return self._size
def is_empty(self): return self._size == 0
def first(self): if self.is_empty: raise Empty("Queue is empty") return self._head._element
def dequeue(self): '''delete the first node''' if self.is_empty: raise Empty("Queue is empty") answer = self._head._element self._head = self._head._next self._size -= 1 if self.is_empty(): self._tail = None return answer
def enqueue(self, e): '''add node to the end''' answer = self._Node(e, None) if self.is_empty: self._head = answer else: self._tail._next = answer self._tail = answer self._size += 1
|
双向链表(DoublyLinked Lists):
一个双向链表有三个整数值: 数值, 向后的节点链接, 向前的节点链接。
循环链表(CircularlyLinked Lists):算法设计的需要
首节点和末节点被连接在一起。这种方式在单向和双向链表中皆可实现。比如单向链表:
一个循环链表包含一个节点:当前节点(current)。
比如CPU的轮叫调度(Round-RobinScheduling)就可以用循环链表来实现。