leetcode过程中发现很多题都用的到链表,在这里跟大家share一些我学习过程中对链表所知所学,如果有错误,希望大家***善意指正***。在此谢谢大家,如果非商业转发,请注明出处。未经允许,此文不能作为商业用途。
1.1单项链表中的认识:
单链表组成原理如下:
上图可以看出链表有一个一个节点组成,节点一般用node表示,其中每个node由数据区(信息域)和连接区(链接域)组成,连接区主要写的是下一个节点的“地址”,从而可以形成有规律的链接。
但在这里需要注意的有两点:
但其实在python中是没有真正“链表”这个概念的,其“赋值”和其他的语言的赋值是不一样的。
在这里可以给大家举一个例子,在python中,给"a"一个数字"10"的意思是把"a"指向的地址为"20",而不是把a就当作了“20”。
再举个例子:a,b,c = 1,2,3. a,b,c = b,c,a则只是把a,b,c 指向的位置发生改变而已。如下图:
更深入的,其实可以明白在python当中,"a"也可以指向其他很多,比如"function"也可以,“a“只是所代表的事物只是其指向的东西,而不是”a”本身。
1.2:python中单链表的建立:
此时我们可以选择建立节点:
这里我不仅仅对链表的介绍不仅仅是限于python,更是对所有语言。
节点的代码:
class Node(object):
def __init__(self,elem):
#保存数据,保存到元素区
self.elem = elem
#刚开始的数据指向对象设置为空,节点初始状态是没有任何指向的,则用None
self.next = None
node = Node(100)
1.3 单链表的设计:
class SingleLinkList(object):
"""单链表"""
def _init_(self, node)#:初始节点也可以设为0,则node = None
self._head =node #开始指向节点,如果node=None,则初始节点为0,则head = None
node = Node(100)
single_obj = singlelinklist(node)
接下来就可以做很多操作了。
2.1
假设已经设置成
node = Node(100)
使用这些的时候首先要创建对象:
如果是指定了链表,就要写成:
Single_obj = SingleLinkList(100)
没有的话就是
Single_obj = SingleLinkList()
这样才能做一些操作,比如
single_obj.add()
2.2empty的功能
empty的主要功能是来判断链表是否为空的。
def is_empty(self):
"""链表是否为空"""
return self._head == None #这个判断一下列表的head是不是空的就可以了
2.3 length的功能
length主要是来判断链表的长度的。
def length(self):
#不需要参数,直接 length(Single_obj)就行
2.4 travel的功能:
travel主要是遍历的作用,是不需要额外设置参数的,在这里我们要介绍一下,在travel中要用到的游标的作用。如图:
def travel()
# cur作为游标,用来移动,遍历节点。
cur = self._head
# count记录数量
count = 0
while cur != None:
count += 1
cur = cur.next
这里也可以用cur.next作为判断条件。
count = 1
while cur.next != None:
count += 1
cur = cur.next
但一定要head,否则两者结果是不一样的。。
2.5 add的作用:
add主要是在链表头添加元素。
def add(self,item):
"""链表头部添加元素"""
2.6 append的作用:
append主要在链表尾部添加元素
def append(self, item):
"""链表尾部添加元素"""
但这里是有一个过程的,首先我们要判断head是不是为空,如果为空的话,则直接把
cur= self._head:
unless则可以用:
cur.next != None:
以此来最终把元素append到结尾。
代码如下:
#添加你需要的节点
#首先设置节点
node = Node(item)
#判断是head是否为none
if self.is_empty():
self._head = node
cur = self._head
#不为none则开始“寻找”尾端。
while cur.next != None:
cur = cur.next
cur.next = node
3.6 删除和查找节点将在下一节中继续讲述。
def insert(self, pos, item):
"""删除元素"""
#这里指的删除元素指的是删除第一个在链表中出现的你指出的"item",但不是删除位置。
def search(self, item):
"""查找节点是否存在"""
#综合例子:
if __name__ == "__main__":
ll = SingleLinkList()
print(ll.is_empty())
print(ll.length())
ll.append(1)
print(ll.is_empty())
print(ll.length())
ll.append(2)
ll.append(3)
ll.append(4)
ll.append(5)
ll.travel