单链表的结构
- 表元素域val用来存放具体的数据。
- 链接域next用来存放下一个节点的位置
- 变量head指向链表的头节点(首节点)的位置,从head出发能找到表中的任意节点。
单链表节点实现
class LinkListNode(object):
"""
单链表节点类初始化
"""
def __init__(self, val=None, next=None):
self.val = val
self.next = next
单链表的实现
class SingleLinkList(object):
"""
生成链表及链表操作类
"""
def __init__(self, head=None):
self.head = head
图解说明
- is_empty() 链表是否为空
- length() 链表长度
- traversal() 遍历整个链表
- add(item) 链表头部添加元素
- append(item) 链表尾部添加元素
- insert(pos, item) 指定位置添加元素
- remove(item) 删除节点
- search(item) 查找节点是否存在
单链表-链表长度(length)
def length(self):
"""
链表长度
:return:
"""
cur = self.head # 初始游标
count = 0
while cur != None:
count += 1
cur = cur.next
return count
图解说明
单链表-链表是否为空(is_empty)
def is_empty(self):
"""
链表是否为空
:return:
"""
flag = False
if self.head is None:
flag = True
return flag
图解说明
单链表-遍历链表(traversal)
def traversal(self):
"""
遍历链表
:return:
"""
cur_node = self.head
while cur_node:
print(cur_node.val, end=" ")
cur_node = cur_node.next
图解说明
单链表-链表头部插入元素(add)
def add(self, data):
"""
头部插入元素
:param data:
:return:
"""
node = LinkListNode(data)
node.next = self.head
self.head = node
图解说明
单链表-链表尾部插入元素(append)
def append(self, data):
"""
尾部插入元素
:param data:
:return:
"""
new_node = LinkListNode(val=data)
if self.is_empty():
self.head = new_node
else:
cur_node = self.head
while cur_node.next:
cur_node = cur_node.next
cur_node.next = new_node
图解说明
单链表-链表指定位置插入元素(insert)
def insert(self, pos, data):
"""
指定位置插入元素
:param pos:
:param data:
:return:
"""
if pos <= 0:
self.add(data)
elif pos > (self.length() - 1):
self.append(data)
else:
pre = self.head
count = 0
while count < (pos - 1):
count += 1
pre = pre.next
node = LinkListNode(data)
node.next = pre.next
pre.next = node
图解说明
单链表-链表查询元素(search)
def search(self, data):
"""
查找元素节点是否存在并返回下标
:param data:
:return:
"""
count = 0
flag = False
cur = self.head
while cur != None:
if cur.val == data:
flag = True
break
else:
cur = cur.next
count += 1
return flag, count
图解说明
单链表-链表删除元素(remove)
def remove(self, data):
"""
移除链表指定元素
:param data:
:return:
"""
cur = self.head
pre = None
while cur != None:
if cur.val == data:
if cur == self.head:
self.head = cur.next
else:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
图解说明
单链表-完整代码及测试
# -*- coding:utf-8 -*-
class LinkListNode(object):
"""
单链表节点类初始化
"""
def __init__(self, val=None, next=None):
self.val = val
self.next = next
class SingleLinkList(object):
"""
生成链表及链表操作类
"""
def __init__(self, head=None):
self.head = head
def is_empty(self):
"""
链表是否为空
:return:
"""
flag = False
if self.head is None:
flag = True
return flag
def length(self):
"""
链表长度
:return:
"""
cur = self.head # 初始游标
count = 0
while cur != None:
count += 1
cur = cur.next
return count
def append(self, data):
"""
尾部插入元素
:param data:
:return:
"""
new_node = LinkListNode(val=data)
if self.is_empty():
self.head = new_node
else:
cur_node = self.head
while cur_node.next:
cur_node = cur_node.next
cur_node.next = new_node
def add(self, data):
"""
头部插入元素
:param data:
:return:
"""
node = LinkListNode(data)
node.next = self.head
self.head = node
def insert(self, pos, data):
"""
指定位置插入元素
:param pos:
:param data:
:return:
"""
if pos <= 0:
self.add(data)
elif pos > (self.length() - 1):
self.append(data)
else:
pre = self.head
count = 0
while count < (pos - 1):
count += 1
pre = pre.next
node = LinkListNode(data)
node.next = pre.next
pre.next = node
def search(self, data):
"""
查找元素节点是否存在并返回下标
:param data:
:return:
"""
count = 0
flag = False
cur = self.head
while cur != None:
if cur.val == data:
flag = True
break
else:
cur = cur.next
count += 1
return flag, count
def remove(self, data):
"""
移除链表指定元素
:param data:
:return:
"""
cur = self.head
pre = None
while cur != None:
if cur.val == data:
if cur == self.head:
self.head = cur.next
else:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
def traversal(self):
"""
遍历链表
:return:
"""
cur_node = self.head
while cur_node:
print(cur_node.val, end=" ")
cur_node = cur_node.next
def main():
node_list = SingleLinkList()
node_list.append(1)
node_list.append(2)
node_list.append(3)
node_list.add(4)
node_list.insert(2, 5)
node_list.search(3)
node_list.remove(3)
node_list.traversal()
if __name__ == '__main__':
main()