单项循环链表基本性质
leetcode过程中发现很多题都用的到链表,在这里跟大家share一些我学习过程中对链表所知所学,如果有错误,希望大家***善意指正***。在此谢谢大家,如果非商业转发,请注明出处。未经允许,此文不能作为商业用途。
1:循环单链表
首先我们用一个图来表达循环单链表和普通单链表的具体区别。
在图中可以看出,我们循环单链表和单链表唯一的区别就是,循环链表的尾部是指向循环单链表的头部。即cur.next = self._head
接下来我们介绍一下基本的一些function的作用。每个稍微有难点的代码我都加了解释,希望大家认真学习哈哈哈哈,一起冲冲冲。
- length的作用:
def length(self):
"""链表长度"""
#cur游标,用来移动遍历节点
if self.is_empty():#判断特殊情况,是不是空节点。
count = 1
return 0
cur = self._head#首先把头节点作为起始节点。
count = 1#开始遍历
while cur.next != self._head:#循环的条件是标尺下一个指向不是头节点
count += 1
cur = cur.next
return count#计数即可
- travel的作用:
def travel(self):#定义travel函数
"""遍历整个链表"""
if self.is_empty():#首先判断是否为空链
return
cur = self._head
while cur.next !=self._head:
print(cur.elem,end=" ")#print 每个在循环里面的function的elements
cur = cur.next
print(cur.elem,end=" ")#print所有的element
- add的作用(主要添加头部元素)
-
def add(self,item): """链表头部添加元素""" node = Node(item)#确定添加的节点的对象 if self.is_empty():#对空链表的一系列操作,如果链表是空的,就可以直接把node当作首节点 self._head = node node.next = node else: cur = self._head while cur.next !=self._head:#判断下面一个是否是开头 cur = cur.next node.next = self._head#1首先让新节点的下一个等于原来的起始节点,让起始节点等于node,之后让尾巴连过来 self._head = node cur.next = node #or cur.next = self._head
- append的作用(尾部添加元素)
def append(self, item):
"""链表尾部添加元素"""
node = Node(item)
if self.is_empty():#先判断none的情况
self._head = node
node.next = node
else:
cur = self._head
while cur.next != self._head:#当两个不想等的时候,可以尾部重新链接。但是是没有断开原来的。
cur = cur.next
node.next = cur.next#如果cur.next等于self._head,则执行该操作,把尾部连到头部来。
cur.next = node
#cur.next = node#这种方法更加让人容易理解。
#node.next = self._head
- insert的作用(插入链表中)
def insert(self, pos, item):
"""删除元素"""
#param pos 从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):
count += 1
pre = pre.next
#当循环推出后,pre应该指向pos-1的位置
node = Node(item)
node.next = pre.next
pre.next = node
- insert的作用
def insert(self, pos, item):
"""插入元素"""
#param pos 从0开始
if pos <= 0:#如果位置小于零,直接调用add函数就好。
self.add(item)
elif pos > (self.length()-1):#不能有等号,等号的意味着插入点是倒数第一个和倒数第二个之间。
self.append(item)
else:
pre = self._head#完全不需要改正
count = 0
while count < (pos-1):
count += 1
pre = pre.next
#当循环退出后,pre应该指向pos-1的位置
node = Node(item)
node.next = pre.next
pre.next = node
#这里指的增加元素指的是增加第一个在链表中出现的你指出的"item",但不是增加位置。
``
- search的作用
def search(self, item):
"""查找节点是否存在"""
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
- `remove的作用:
-
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.elem == self._head: # 头节点情况 # 找尾节点 rear = self._head while rear.next != self._head: rear = rear.next self._head = cur.next rear.next = self._head else: #中间节点 pre.next = cur.next return else: pre = cur cur = cur.next #退出循环,cur指向尾节点 if cur.elem == item: if cur == self._head: """只有一个节点"""