python实现链表(含剑指offer例题)

问题背景:面临秋招,需要刷《剑指offer》了 /惨
参考链接:
https://www.cnblogs.com/kumata/p/9147077.html
https://www.cnblogs.com/yupeng/p/3413763.html


一、链表简介

链表是通过一个个节点(Node)组成的,每个节点都包含了称为数据域(value)和指针域(next)的基本单元。示意图如下:
在这里插入图片描述
数据域/值域:用来存放用户数据;
指针域:用来存放指向下一个元素的指针。
head: 指向第一个节点
tail: 指向最后一个节点
None: 链表中最后一个节点的指针域为None值
注:这些节点在逻辑上是相连的,但在物理内存上并不相连。

一、定义

定义节点类

class Node(object):
    def __init__(self,val,p=0):
        self.data = val #数据域
        self.next = p #指针域

有了节点之后,定义链表类

class LinkList(object):
    def __init__(self):
        self.head = 0
    def initlist(self,data):
        self.head = Node(data[0]) #head节点
        p = self.head
        for i in data[1:]:
            node = Node(i) #存入数据域
            p.next = node #指针域
            p = p.next

对这个类进行实例化

l = LinkList()
l.initlist([1,2,3,4,5]) #创建了一个链表

二、解题

以下都是我自己的解法,可能不是最优解,只是通过了测试~

1)输入一个链表,输出该链表中倒数第k个结点。

class Solution:
    def FindKthToTail(self, head, k):
        # write code here
        arr=[] #定义一个数组
        while head!=None: #当还没到遍历完
            arr.append(head) 
            head=head.next
        if k>len(arr) or k<1: 
            return                    #return 与return None相同,会结束函数
        return arr[-k]

2)输入一个链表,反转链表后,输出新链表的表头。

class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        if pHead==None:  #空链表
            return None
        if pHead.next==None: #只有一个节点
            return pHead
        last=None 
        while pHead!=None:
            tmp=pHead.next  #暂存下一节点
            pHead.next = last #当前节点指向上一节点
            last = pHead #前进一格,上一节点变为当前节点
            pHead = tmp #前进一格,当前节点变为下一节点
        return last

3)输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        result=ListNode(0) #定义一个含有100个节点的链表,存储结果
        p=result 
        while pHead1 and pHead2:  #只要遍历完其中一个链表就可以
            if pHead1.val<=pHead2.val:
                result.next=pHead1
                pHead1=pHead1.next
            elif pHead1.val>pHead2.val:
                result.next=pHead2
                pHead2=pHead2.next
            result=result.next
        if pHead1!=None:  #看谁还剩下
            result.next=pHead1
        elif pHead2!=None:
            result.next=pHead2
        return p.next #这里如果写return p会把头节点也包含进去
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章