算法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