数据结构中的链表是经常面试的东西,它有一定难度,但是代码量有比较小,可以说是最最常见的一类白板编程,链表(linkedlist)chain和数组不同,它依靠节点中指针来确定顺序,物理上并不连续
构造chain
去年做过Java linked list的源码分析,显然个人并不能做的更好,现在只能用python复现一下:
class chainNode(object):
__slots__ = ['value','next'] ##限定结点属性
def __init__(self,value,node):
self.value = value
self.next = node
def getValue(self):return self.value
def getNext(self):return self.next
def setValue(self,val):self.value=val
def setNext(self,node):self.next=node
class chain(object):
def __init__(self):
self.size = 0
self.head = None
结点构造如上,chain的构造,属性包含长度size、头节点head,因为我们只想构造一个单链表,如果双链表需要再加一个tail尾结点,叙述思路很明显:chain的构造、chain的操作(API)、chain扩张(双链表、循环链表、哨兵)、复杂操作
chain的基本操作
##add
def addHead(self,val):
node = chainNode(val)
if self.head is None:
self.head = node
self.size == self.size + 1
return
node.setNext(self.head)
self.head = node
self.size == self.size + 1
return
def addLast(self,value):
node = chainNode(value)
if self.head is None:
head = node
else:
current = self.head
while current.getNext() != None:
current = current.getNext()
current.next = node
return
##remove
def remove(self,val):
##判断链表空
current = self.head
while current != None:
if current.value == val:
##m没有判断删除的是不是尾巴结点,current.next可能为空
current.value = current.next.value
current.next = current.next.next
return
else:
current = current.next
##insert
def insert(self,pos,val):
if pos > self.size:
self.addLast(val)
else:
node = chainNode(val)
current = self.head
while pos > 1:
current = current.getNext()
pos = pos - 1
node.next = current.next
current.next = node
return
数据结构的基本操作目前我做的只有增删改查,其中还有还多坑,主要集中在边界检测,Awww..........
复杂链表(双向链表、循环链表、哨兵)
后续
leetcode
删除:删除指定节点
删除指定值节点:如上
删除倒数第n个结点:两个指针
移动:链表反转:三个指针,后俩反转,最后记得第一个结点的指针置空(生命危险 :))
合并:
环:判断是否有环、判断环的入口
从尾到头输出结点:栈
线程安全的chain(阻塞实现和非阻塞实现)
以上全部后续!!!!!!