算法14~19中,la、lb、lc为各个单链表的头指针

算法14~19中,la、lb、lc为各个单链表的头指针,直接用头指针表示和操作单链表。

15.la和lb分别为两个不带头结点的单链表,设计算法,从la中删除自i号元素起共len个结点,并将这len个结点插入到Ib中的i号结点之前。

答案
class LNode:
    def __init__(self, data):
        self.data = data
        self.next = None

def move_node(la, lb, q, x, length):
    """
    :param la: 不带头结点,la是链表第一个结点对象,None代表空链表
    :param lb: 不带头结点,lb是链表第一个结点对象
    :param q: lb内部的某个结点,片段插入q的前面
    :param x: la中起始元素值
    :param length: 需要截取结点数量
    :return: (新la头结点, 新lb头结点)
    """
    p = la
    prep = None
    # 1.查找值等于x的结点p,prep是p的前驱
    while p is not None and p.data != x:
        prep = p
        p = p.next
    if p is None:
        return la, lb  # 找不到x,原样返回

    seg_start = p  # 截取片段的首结点
    k = 0
    seg_tail = None
    # 向后取最多length个结点
    while p is not None and k < length:
        seg_tail = p
        p = p.next
        k += 1

    # 2:把片段从la摘除
    if prep is None:
        new_la = p
    else:
        prep.next = p
        new_la = la

    #3:把 seg_start ~ seg_tail 插入lb的q结点前面
    #先找q的前驱pr
    if lb == q:
        # q就是lb第一个结点,片段插最前面
        seg_tail.next = lb
        new_lb = seg_start
    else:
        pr = lb
        while pr.next != q:
            pr = pr.next
        pr.next = seg_start
        seg_tail.next = q
        new_lb = lb

    return new_la, new_lb

题目信息

题号:8239
题型:简答题
知识点:Python
难度:普通