python数据结构学习附代码(一)链表

链表结构(linked structure)是程序中最常用的数据结构。其由两种结构:单向链表和双向链表

单向链表:由头和节点组成,链表只能向前移动

双向链表:由头、尾和节点构成,链表双向移动

链表无法指定索引,因此必须从结构的一端开始。单链表访问时必须由头开始,逐次获取后继项。双链表允许从头或者尾开始。

最后一项是空链接,其缺少下一个连接

1.单向链表的定义及其遍历

#定义Node类为节点,data是存储的值,next是下一个节点,尾节点必须是None
class Node(object):
    def __init__(self, data, next=None):
        self.data = data
        self.next = next
#链表可以由for循环产生
if __name__ == "__main__":
    head = None
    for count in range(6):
        head = Node(count, head)
#链表可以通过循环遍历,直到下一个节点为空节点时结束遍历
    while head != None:
        print(head.data)
        head = head.next

链表的遍历在时间上是线性的。

2.链表的搜索

def find_val(node, val):
    while node != None and node.data != val:
        node = node.next
    return node

注意防止链表中并没有与目标值匹配的节点值时,遇见尾部(None)也需要结束

3.链表的替换

def replace(node, OldVal, NewVal):
    while node != None and node.data != OldVal:
        node = node.next
    if node!=None:
        node.data = NewVal

4.末尾处插入

def insert_InTail(node, val):
    new_node = Node(val, None)
    if node is None:
        Node = new_node
    while node.next != None:
        node = node.next
    node.next = new_node

找到尾部,创建一个新的节点,加入尾部。

注意,当链表是一个空链表的时候,初始节点为空,直接替换成新的节点。

5.开始处插入

def insert_InHead(node, val):
    node = Node(val, node)
    return node

这个是链表结构优于线性操作的操作。

6.开始处删除

def delete_InHead(node):
    if node is None:
        return None, None
    data = node.data
    node = node.next
    return node, data

7.尾部处删除

def delete_InTail(node):
    x = node
    if x is None:
        return None, None
    if x.next is None:
        data = x.data
        return None, data
    while x.next.next != None:
        x = x.next
    data = x.next.data
    x.next = None
    return node, data

8.任意位置插入

def insert(node, index, val):
    if node is None or index <=0:
        node = Node(val, node)
        return node
    else:
        prob = node
        while index > 1 and prob.next != None:
            prob = prob.next
            index -= 1
        prob.next = Node(val, prob.next)
        return node

9.任意位置删除

def delete(node, index):
    if index <= 0 or node.next is None:
        remove = node.data
        node = node.next
        return node, remove
    else:
        prob = node
        while index > 1 and prob.next.next != None:
            prob = prob.next
            index -= 1
        remove = prob.next.data
        prob.next= prob.next.next
        return node, remove

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值