线性结构-相关算法

编译环境:python v3.5.0, mac osx 10.11.4

多项式加法与乘法运算(队列)

主要思路:

  • 对于多项式的加法:相同指数项的系数相加,其他部分进行拷贝,如下图所示:
    线性结构-相关算法_第1张图片
  • 对于多项式的乘法:选定一个多项式,将其中的元素逐个与另一多项式相乘,形成新的多项式。最后再对这些多项式进行相加。(polynomial.py)
    # -
    - coding: utf-8 --
    class polyNode():
    def init(self, coef, expon, next=None): # 构建链表单元结构
    self.coef = coef
    self.expon = expon
    self.next = next
    # ---------------队列定义--------------------------------
    class queueChain:
    def init(self, front=None, rear=None):
    self.front = front # fron指向表头的指针
    self.rear = rear # rear指向表尾的指针
    def inQue(queue, newNote): # 入队操作
    if queue.front is None: # 链表为空,将front 赋值给表头
    queue.front = queue.rear = newNote
    else:
    queue.rear.next = newNote
    queue.rear = newNote
    def outQue(queue): # 出队操作
    if queue.front is None: # 如果front指向为空,则链表为空
    print('it is an empty queue!')
    else:
    p = queue.front
    if queue.front == queue.rear: # 如果前后指针指向一个元素,则全部重置为None
    queue.front = queue.rear = None
    else:
    queue.front = p.next
    return p
    # -------------------------加法定义-------------------
    def polyAdd(ps1, ps2):
    storePoly = queueChain() # 构建存放结果的队列
    p1 = ps1.front # 构建 p1,p2分别指向存放元素的表头
    p2 = ps2.front
    while p1 is not None and p2 is not None:
    compare = p1.expon - p2.expon # 对比两者指数的大小
    if compare > 0: # 如果p1的指数大
    inQue(storePoly, p1)
    p1 = p1.next # 将指针指向p1下一个元素
    elif compare < 0: # 如果p2的指数大
    inQue(storePoly, p2)
    p2 = p2.next # 将指针指向p2下一个元素
    else:
    if p1.coef + p2.coef: #没有抵消则入队
    newNote = polyNode(p1.coef + p2.coef, p1.expon) # 如果相等则同时出队,并系数相加后进入结果链
    inQue(storePoly, newNote)
    p1 = p1.next
    p2 = p2.next
    while p1 is not None:
    inQue(storePoly, p1)
    p1 = p1.next
    while p2 is not None:
    inQue(storePoly, p2)
    p2 = p2.next
    return storePoly
    # -------------------------乘法法定义-------------------
    def polyMultiple(ps1,ps2):
    storePoly = queueChain()
    p1 = ps1.front # 构建 p1,p2分别指向存放元素的表头
    p2 = ps2.front
    while p1 is not None: # 将p1中的元素逐个弹出
    tag = p2 # tag 指向p2的头指针,用于循环相乘
    newP2 = queueChain() # 存放一次相乘结果的队列
    while tag is not None: # 将爬p1弹出的元素逐个与p2中的元素相乘
    if p1.coef
    tag.coef:
    inQue(newP2,polyNode(coef=p1.coef*tag.coef,expon=p1.expon+tag.expon))
    tag =tag.next
    p1 = p1.next
    storePoly = polyAdd(newP2,storePoly)
    return storePoly

单向链表反转(单向链表)

给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(<= 10^5)、以及正整数K(<=N),即要求反转的子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。
接下来有N行,每行格式为:
Address Data Next
其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。
输出格式:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
输入样例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

主要思路:(reverse_linkedList.py)

  • 首先要对输入数据进行预处理,即按地址连接,形成单向链表。(要考虑到多余节点的情况,所以链接到head=‘-1’时就终止)


    线性结构-相关算法_第2张图片
  • 在反转链表时,可以逐个反转,再将未反转的序列加入到链表中


    线性结构-相关算法_第3张图片

你可能感兴趣的:(线性结构-相关算法)