一、链表的概念
链表是具有动态增加元素功能的一种结构,和数组相比,链表在插入和删除元素时时间复杂度小,但是在查找元素时必须从头查找,每个元素都有指针,存储下一个元素的地址。
之前在学习数据结构当中,虽然懂链表的原理,但一直没有实现过,通过最近的学习,掌握了链表的实现,链表实现代码如下:
class ListNode:
#构造一个生成链表函数
def __init__(self,x):
self.val = x
self.next = None
#printNode函数是来打印生成好的链表中的数据
def printNode(node):
while node:
print(node.val)
node = node.next
l1 = ListNode(1)#生成链表中节点
l2 = ListNode(2)
l3 = ListNode(3)
l1.next = l2#将节点链在一起
l2.next = l3
printNode(l1)#打印整个链表
显示结果:
二、链表相关的编程题
1、从尾到头打印链表:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
解题思路:构建一个空列表,将每次获得的链表中的值插入到列表的头部。
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回从尾部到头部的列表值序列,例如[1,2,3]
def printListFromTailToHead(self, listNode):
l = []#定义空列表存储要返回链表中的值
head = listNode#一个指针用来获取每一个节点
while head:
l.insert(0, head.val)#每次向最开始的地方插入值就会逆序存储链表
head = head.next
return l
2、链表中倒数第k个结点:输入一个链表,输出该链表中倒数第k个结点。
第一种解题思路:用链表的长度n减去第K个节点,然后剩下的值就是从链表头开始循环到n-k个,还要注意边界条件,当k的取值大于链表长度和小于0时。
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
length = 0
newHead = head
while newHead:
newHead = newHead.next
length +=1
l = length -k
if l&