关于链表的算法题

1.输入一个链表,按链表值从尾到头的顺序返回一个ArrayList.

class Node():
    def __init__(self,item):
        self.item = item
        self.next = None

        
class Solution():
    def print_list(self,node):
        list1 = []
        cur = node
        while cur:
            #在列表的头部插入元素
            list1.insert(0,cur.item)
            cur = cur.next
        return list1
    
if __name__ == "__main__":
    n1 = Node(1)
    n2 = Node(2)
    n3 = Node(3)
    n1.next = n2
    n2.next = n3
    s  = Solution()
    list1 = s.print_list(n1)
    print(list1)

输出结果:

2.输入一个链表,输出该链表中倒数第K个结点

class Node():
    def __init__(self,item):
        self.item = item
        self.next = None
        
        
class Solution():    
    def findKnode(self,head,k):
        first = head
        second = head
        #循环从1开始,是因为当first和second都指向head时,i为0
        #考虑特殊情况:当K大于链表长度时,first会指向None
        for i in range(1,k):
            first = first.next
            if first == None:
                return None
        #first和second开始同步移动,当first.next指向None时停止
        while first.next != None:
            first = first.next
            second = second.next
        return second.item

if __name__=="__main__":
    #构造单向链表
    head = Node(1)
    n2 = Node(2)
    n3 = Node(3)
    n4 = Node(4)
    n5 = Node(5)
    head.next = n2
    n2.next = n3
    n3.next = n4
    n4.next = n5
    #输出倒数第一个结点
    s = Solution()
    data = s.findKnode(head,1)
    print(data)

输出结果:

3.输入一个链表,反转链表后,输出新链表的表头

class Node():
    def __init__(self,item):
        self.item = item
        self.next = None
        
        
class Solution():
    def reverselinklist(self,head):
        #特殊情况:链表为空或者只有一个元素
        if head == None:
            return None
        if head.next == None:
            return head.item
        #一般情况:应设置三个指针,right指针只需向前移动即可
        left = head
        middle = head.next
        right = middle.next
        
        left.next = None
        while right != None:
            middle.next = left
            left = middle
            middle = right
            right  = right.next
        middle.next = left
        return middle.item
    
if __name__=="__main__":
    head = Node(1)
    n2 = Node(2)
    n3 = Node(3)
    n4 = Node(4)
    n5 = Node(5)
    head.next = n2
    n2.next = n3
    n3.next = n4
    n4.next = n5
    
    s = Solution()
    data = s.reverselinklist(head)
    print(data)

输出结果:

4.输入两个单调递增链表,输出两个链表合成后的链表,需要合成后的链表满足单调不减规则。

思路:其实就是归并排序的最后一步,将左右两部分已有序的元素比较。

class Node():
    def __init__(self,item):
        self.item = item
        self.next = None
        

class Solution():
    def merge(self,link1,link2):
        #考虑特殊情况:链表为空
        if link1 == None:
            return link2
        if link2 == None:
            return link1
        #分别对两个链表设置当前指针cur1和cur2
        cur1 = link1
        cur2 = link2
        #res表示合成后链表的输出指针
        res = cur1 if cur1.item < cur2.item else cur2
        if res == cur1:
            cur1 = cur1.next
        else:
            cur2 = cur2.next
        #设置pre指针
        pre = res
        #pre指针所指向的结点连接到cur1和cur2中较小值
        while cur1 and cur2:
            if cur1.item < cur2.item:
                pre.next = cur1
                pre = cur1
                cur1 = cur1.next
            else:
                pre.next = cur2
                pre = cur2               
                cur2 = cur2.next
        #当遍历某一链表到None时,pre指针将指向未遍历完的链表        
        if cur1 == None:
            pre.next = cur2
        else:
            pre.next = cur1
        #打印合成后的链表中元素
        while res is not None:
            print(res.item)
            res = res.next
#         return res

if __name__=="__main__":
    link1 = Node(1)
    n2 = Node(2)
    n3 = Node(4)
    n4 = Node(5)
    n5 = Node(7)
    link1.next = n2
    n2.next = n3
    n3.next = n4
    n4.next = n5

    link2 = Node(3)
    m2 = Node(6)
    m3 = Node(8)
    m4 = Node(10)

    link2.next = m2
    m2.next = m3
    m3.next = m4

    s = Solution()
    s.merge(link1,link2)   

输出结果:

5.输入两个链表,找出它们的第一个公共结点

例如:

class Node():
    def __init__(self,item):
        self.item = item
        self.next = None
        

class Solution():
    def print_public(self,link1,link2): 
        #设置当前指针cur1和cur2
        cur1 = link1
        cur2 = link2
        #设置指针p1和p2
        p1 = link1
        p2 = link2
        #分别计算两个链表的长度
        count1 = 0
        count2 = 0
        while cur1 is not None:
            cur1 = cur1.next
            count1 += 1
        while cur2 is not None:
            cur2 = cur2.next
            count2 += 1 
        #求出多出的部分,让指针移动到两链表相同位置
        if count1 > count2:
            k = count1 - count2
            for i in range(k):
                p1 = p1.next
            #在两链表相同位置开始向后移动
            for j in range(count2):
                p1 = p1.next
                p2 = p2.next
                #当两指针指向的下一个结点相同时,则下一个结点为两链表的第一个公共结点
                if p1.next == p2.next:
                    print(p1.next.item)
                    return p1.next
                    break       
        elif count2 > count1:
            k = count2 - count1
            for i in range(k):
                p2 = p2.next
            for j in range(count1):
                p1 = p1.next
                p2 = p2.next
                if p1.next == p2.next:
                    print(p1.next.item)
                    return p1.next
                    break

if __name__=="__main__":
    #设置链表1
    link1 = Node(1)
    n2 = Node(2)
    n3 = Node(3)
    n4 = Node(4)
    n5 = Node(5)
    n6 = Node(6)
    n7 = Node(7)
    link1.next = n2
    n2.next = n3
    n3.next = n4
    n4.next = n5
    n5.next = n6
    n6.next = n7
    #设置链表2
    link2 = Node(8)
    m2 = Node(9)
    m3 = Node(10)
    m4 = Node(11)
    
    link2.next = m2
    m2.next = m3
    m3.next = m4
    m4.next = n6
    
    s = Solution()
    link = s.print_public(link1,link2)  
    print(link)

输出结果:

6.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值