python 链表 【测试题】

文章目录

    • 注意:
        • 实例讲解
    • 1 .链表基本功能
    • 2. 根据值删除链表中的节点
      • 信息
      • 答案:
    • 3.反转一个单链表
      • 信息
      • 答案
    • 4.合并两个有序链表
      • 信息
      • 答案
    • 5.删除排序链表中的重复元素
      • 信息
      • 答案
    • 6.移除链表元素
      • 信息
    • 7.环形链表
      • 信息
      • 进阶
      • 思路
      • 答案

注意:

  • 这里的head是只存储地址。

实例讲解

prev = None  # 前指针节点
curr = head  # 当前指针节点
# 每次循环,都将当前节点指向它前面的节点,然后当前节点和前节点后移
while curr:nextTemp = curr.next  # 临时节点,暂存当前节点的下一节点,用于后移curr.next = prev  # 将当前节点指向它前面的节点prev = curr  # 前指针后移curr = nextTemp  # 当前指针后移
return prev 
  • 第四行的nextTemp = curr.next :(.next在等号右边)表示下一个节点的地址
  • 第五行的curr.next (.next在等号左边)表示curr所指节点的地址

1 .链表基本功能

class ListNode:
"""
创建单个节点
"""
def __init__(self, x):self.val = xself.next = Noneclass MyLinkedList(object):"""单链表"""def __init__(self):"""头指针默认地址为空长度为0"""self.head = Noneself.length = 0def is_empty(self):"""判断链表是否为空"""return self.head == Nonedef get(self, index):"""依据索引值获取指定节点值(下表从0开始):type index: int:rtype: int"""if index < 0 or index >= self.length:"""索引值小于0或者索引值大于等于长度,返回-1"""return -1p = self.headfor i in range(self.length):if i == index:return p.valelse:p = p.nextdef addAtHead(self, val):"""头部添加元素"""# 先创建一个保存val值的节点node = ListNode(val)# 将新节点的链接域next指向头节点,即self.head指向的位置node.next = self.head# 将链表的头self.head指向新节点self.head = nodeself.length += 1def addAtTail(self, val):"""尾部添加元素"""node = ListNode(val)# 先判断链表是否为空,若是空链表,则将self.head指向新节点if self.is_empty():self.head = node# 若不为空,则找到尾部,将尾节点的next指向新节点else:cur = self.headwhile cur.next:"""找到最后一个节点"""cur = cur.nextcur.next = nodeself.length += 1def addAtIndex(self, index, val):"""在指定为值添加索引,下标从0开始思想:新建一个计数变量count:type index: int:type val: int:rtype: None"""head = self.headif index <= 0:self.addAtHead(val)elif index == self.length:"""索引值等于链表长度,讲节点加到链表的尾部"""self.addAtTail(val)elif index < self.length and index > 0:prev = headcount = 0while count < index - 1:count += 1prev = prev.nextnode = ListNode(val)node.next = prev.nextprev.next = nodeself.length += 1def deleteNode(self, val):"""删除指定节点node ,从头遍历:param node::return: 返回新链表q"""head = self.headq = head"""p,q 用来 迭代"""p = q.nextif q.val == val:    """如果头结点就是要删除的结"""self.length -= 1self.head = p"""要改变self.head,因为遍历的时候是从self.head开始的"""print('self.length:', self.length)return pwhile p:if p.val == val:q.next = p.nextself.length -= 1print('lenth', self.length)return qelse:q = pp = p.nextdef deleteAtIndex(self, index):"""在指定位置删除:type index: int:rtype: None"""prev = self.headif index == 0:self.head = self.head.nextelif index > 0 and index < self.length:# count从1开始count = 1while count < index:prev = prev.indexprev.next = prev.next.nextself.length -= 1def travel(self):"""遍历链表"""cur = self.headwhile cur:print('val:', cur.val)cur = cur.nextprint("")def midNode(self):"""快慢指针,寻找中间节点fast走两步,slow走一步:return:返回mid的值"""head = self.headif head is None or head.next is None:"""没有节点,或者只有一个节点"""return head.valfast = headslow = headwhile fast.next and fast.next.next:"""当为奇数个点的时候,fast.next会为空,跳出while循环当为偶数个点的时候,fast.next.next会为空,跳出while循环"""fast = fast.next.nextslow = slow.nextif fast.next:print('有偶数个点')else:print('有奇数个点')return slow.valdef reverseList(self, head):"""反转一个单向链表:param head:头部指针:param prev:反转后的头结点:return: 返回反转后的链表"""prev = None  # 前指针节点curr = head  # 当前指针节点# 每次循环,都将当前节点指向它前面的节点,然后当前节点和前节点后移while curr:nextTemp = curr.next  # 临时节点,暂存当前节点的下一节点,用于后移curr.next = prev  # 将当前节点指向它前面的节点prev = curr  # 前指针后移curr = nextTemp  # 当前指针后移return prev# 递归思路:在return处调用自己(尾递归)# if not head:#     return prev## curr, head.next = head.next, prev  # 新旧链表的两个方向同时前进# return self.reverseList(curr, head)def isPalindrome(self):"""判断回文链表的思想:1.找到中间节点slow2.把后半部分,逆序3.把前半部分和后半部分比较:type head: ListNode:rtype: bool"""head = self.headfast = headslow = headwhile fast and fast.next:"""当fast.next为None说明,fast已经在最后一个节点。也表明有奇数个点当fast.next.next为空None,fast在倒数第二个节点。也表明有偶数个点"""fast = fast.next.nextslow = slow.nextprev = None  # 前指针节点curr = slow  # 当前指针节点# 每次循环,都将当前节点指向它前面的节点,然后当前节点和前节点后移while curr:nextTemp = curr.next  # 临时节点,暂存当前节点的下一节点,用于后移curr.next = prev  # 将当前节点指向它前面的节点prev = curr  # 前指针后移curr = nextTemp  # 当前指针后移while head and prev:if head.val != prev.val:return Falsehead = head.nextprev = prev.nextreturn Truedef getIntersectionNode(self, headA, headB):"""相交链表,找到两个单链表相交的起始节点例如:listA = [4,1,8,4,5], listB = [5,0,1,8,4,5]相交节点的值为8:type head1, head1: ListNode:rtype: ListNode""""""定义两个指针, 第一轮让两个到达末尾的节点指向另一个链表的头部, 最后如果相遇则为交点(在第一轮移动中恰好抹除了长度差)两个指针等于移动了相同的距离, 有交点就返回, 无交点就是各走了两条指针的长度"""p = headAq = headB# 在这里第一轮体现在pA和pB第一次到达尾部会移向另一链表的表头, 而第二轮体现在如果pA或pB相交就返回交点, 不相交最后就是null == nullwhile p != q:p = p.next if p else headB  # 如果p成立,p = p.next,若不成立,p = headBq = q.next if q else headAreturn pL = MyLinkedList()
print('----插入节点:-----')
L.addAtTail(1)
L.addAtTail(2)
L.addAtTail(3)
L.addAtTail(2)
L.addAtTail(1)
L.travel()
print('----寻找中间节点----')
A = L.midNode()
print(A)
print('----依据索引值获取节点的值-----')
b = L.get(2)
print(b)
print('----依据索引进行添加值(下标从0开始)----')
L.addAtIndex(2, 6)
L.travel()
print('长度:', L.length)
print('----删除节点(包括可以删除头部,尾部)----')
L.deleteNode(3)print('----根据索引值删除指定节点(下标从0开始)----')
L.deleteAtIndex(0)
L.travel()print('----判断是不是回文链表----')
L.travel()
print(L.isPalindrome())
# print(D)

2. 根据值删除链表中的节点

信息

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

现有一个链表 – head = [4,5,1,9]

示例 1:

输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:

输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

说明:

链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。

答案:

class ListNode:def __init__(self, x):self.val = xself.next = Noneclass Solution:def deleteNode(self, node):""":type node: ListNode:rtype: void Do not return anything, modify node in-place instead."""node.val = node.next.valnode.next = node.next.next

3.反转一个单链表

信息

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

答案

def reverseList(self,head,prev=None):"""反转一个单向链表:param head:头部指针:param prev:反转后的头结点:return: 返回反转后的链表"""while head:curr = headhead = head.nextcurr.next = prevprev = currreturn prev# 递归思路:在return处调用自己(尾递归)# if not head:#     return prev## curr, head.next = head.next, prev  # 新旧链表的两个方向同时前进# return self.reverseList(curr, head)

4.合并两个有序链表

信息

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

答案

class Solution:def mergeTwoLists(self, l1: ListNode, l2: ListNode):if l1 is None and l2 is None:return None# 新建了一个值为0的头部指针,所以我们在返回的时候要加.next(很巧妙),这样就不包含0这个节点了new_list = ListNode(0)pre = new_listwhile l1 is not None and l2 is not None:if l1.val < l2.val:pre.next = l1l1 = l1.nextelse:pre.next = l2l2 = l2.nextpre = pre.nextif l1 is not None:pre.next = l1else:pre.next = l2return new_list.next

5.删除排序链表中的重复元素

信息

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入: 1->1->2
输出: 1->2
示例 2:

输入: 1->1->2->3->3
输出: 1->2->3

答案

 class ListNode:def __init__(self, x):self.val = xself.next = Noneclass Solution:def deleteDuplicates(self, head: ListNode) -> ListNode:""":type head: ListNode:rtype: ListNode"""if head is None:return Noneh = ListNode(head.val)current = hflag = head.valwhile head:if flag == head.val:head = head.nextelse:current.next = ListNode(head.val)current = current.nextflag = head.valhead = head.nextreturn h

6.移除链表元素

信息

删除链表中等于给定值 val 的所有节点。

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

def removeElements(self, head: ListNode, val: int) -> ListNode:if head:while head.val == val:head = head.nextif head is None:return headq = headp = q.nextwhile p:if p.val == val:q.next = p.nextelse:q = q.nextp = p.nextreturn head

7.环形链表

信息

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

进阶

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

思路

  • 1.快和慢两个指针,如果有环,则一定会相遇。一个指针走一步,一个指针走两步。

答案

 class ListNode(object):def __init__(self, x):self.val = xself.next = Noneclass Solution(object):def hasCycle(self, head):""":type head: ListNode:rtype: bool"""if not head:return Falsep1 = headp2 = head.nextwhile(1):if p1 == None or p2 == None or p2.next == None:return Falseelif p1 == p2:return Trueelse:p1 = p1.nextp2 = p2.next.next

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebService应用一例,带有安全验证

1、创建WEB项目&#xff0c;添加WEB服务WebService1.asmx&#xff0c;代码如下&#xff1a; 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Web;5 using System.Web.Services;6 7 namespace WebService8 {9 /// <summary> …

linux集成开发环境

Linux操作系统的种种集成开发环境随着Linux的逐渐兴起&#xff0c;已经有为数众多的程序在上面驰骋了&#xff0c;许多开发环境(Development Environment)也应运而生。好的开发环境一定是集成了编辑、编译和调试等多项功能并且易于使用。本文介绍了一些在Linux上流行的开发环境…

mysql技术内幕《读书笔记》

文章目录1. mysql 体系结构和存储引擎1.5 连接mysql1.5.11. mysql 体系结构和存储引擎 1.5 连接mysql 连接mysql操作是一个连接进程和mysql数据库实例进行通信。 本质是进程通信&#xff0c;常用的进程通信方式有管道&#xff0c;命名管道&#xff0c;命名字&#xff0c;TCP/…

DEDECMS全版本gotopage变量XSS ROOTKIT 0DAY

影响版本&#xff1a; DEDECMS全版本 漏洞描叙&#xff1a; DEDECMS后台登陆模板中的gotopage变量未效验传入数据&#xff0c;导致XSS漏洞。 \dede\templets\login.htm 65行左右 <input type"hidden" name"gotopage" value"<?php if(!empty($g…

Android开源库loopj的android-async-http的 JsonHttpResponseHandler 存在死循环GC_CONCURRENT

我现在用的是 AndroidAsyncHttp 1.4.4 版本&#xff0c;之前遇到一个很奇怪的问题&#xff0c; 当使用 JsonHttpResponseHandler 解析请求的页面出现服务器错误或其他情况返回的内容不是 JSON 字符串时不会调用自己复写实现的 onSuccess 或者 onFailure 方法&#xff0c;将会出…

python【进阶】4.文本和字节序列

文章目录1. 字符、码位和字节表述4.1字符问题2. bytes、bytearray 和 memoryview 等二进制序列的独特特性3. 全部 Unicode 和陈旧字符集的编解码器4.避免和处理编码错误5.处理文本文件的最佳实践6.默认编码的陷阱和标准 I/O 的问题7.规范化 Unicode 文本,进行安全的比较8.规范化…

C#序列化和反序列化

序列化和反序列化我们可能经常会听到&#xff0c;其实通俗一点的解释&#xff0c;序列化就是把一个对象保存到一个文件或数据库字段中去&#xff0c;反序列化就是在适当的时候把这个文件再转化成原来的对象使用。我想最主要的作用有&#xff1a; 1、在进程下次启动时读取上次保…

python【进阶】5.一等函数(注销)

在 Python 中,函数是一等对象。编程语言理论家把“一等对象”定义为满足下述条件的程 序实体: 在运行时创建能赋值给变量或数据结构中的元素能作为参数传给函数能作为函数的返回结果 在 Python 中,所有函数都是一等对象。 5.1 把函数视作对象 >>> def d(n): ... …

进程状态转换(了解)

进程三个基本状态&#xff1a;就绪、阻塞、运行 这个比较简单&#xff0c;进程创建后进入就绪状态、然后若CPU空闲或能打断CPU正在执行的进程&#xff08;优先级低的&#xff09;&#xff0c;那么就绪状态转换成运行态&#xff0c;运行时&#xff0c;进程需要用到其他资源&…

rebuild online意外终止导致ora-8104错误的实验

rebuild online意外终止导致ora-8104错误的实验 SQL> !oerr ora 810408104, 00000, "this index object %s is being online built or rebuilt"// *Cause: the index is being created or rebuild or waited for recovering // from the online (re)build // *Act…

关于range方法,如果你觉得python很简单就错了

前言&#xff1a;在系统学习迭代器之前&#xff0c;我一直以为 range() 方法也是用于生成迭代器的&#xff0c;现在却突然发现&#xff0c;它生成的只是可迭代对象&#xff0c;而并不是迭代器&#xff01; 1、range() 是什么&#xff1f; 对于 range() 函数&#xff0c;有几个注…

centos下crontab的使用

1.作用使用crontab命令可以修改crontab配置文件&#xff0c;然后该配置由cron公用程序在适当的时间执行&#xff0c;该命令使用权限是所有用户。2.格式crontab [-u user] {-l | -r | -e}3.crontab命令选项: -u指定一个用户, -l列出某个用户的任务计划, -r删除某个用户的任务, -…

关于python3中的包operator(支持函数式编程的包)

文章目录1.functools2.operator.itemgetter3.operator.attrgetter虽然 Guido 明确表明,Python 的目标不是变成函数式编程语言,但是得益于 operator 和 functools 等包的支持,函数式编程风格也可以信手拈来。接下来的两节分别介绍这两 个包。 1.functools 示例1 使用 reduce 函…

collections 中的namedtuple

文章目录namedtuple 基本用法namedtuple特性_make(iterable)_asdict()_replace(**kwargs)_fields_fields_defaults参考&#xff1a;namedtuple 基本用法 Tuple还有一个兄弟&#xff0c;叫namedtuple。虽然都是tuple&#xff0c;但是功能更为强大。对于namedtuple&#xff0c;你…

abap 中modify 的使用

1、modify table itab from wa Transporting f1 f2 ... 表示表itab中符合工作区wa 中关键字的一条数据的 f1 f2字段会被wa中对应的字段值更新。 modify用于更新和新增数据&#xff0c;当表中没有数据时就新增&#xff0c;有就修改。 2、在使用binary search 时一定要先排序&am…

python[进阶] 6.使用一等函数实现设计模式

文章目录6.1.1 经典的“策略”模式6.1.2 使用函数实现“策略”模式6.1.3 选择最佳策略&#xff1a;简单的6.1.4 找出模块中的全部6.2 “命令”模式6.1.1 经典的“策略”模式 为抽象基类&#xff08;Abstract Base Class&#xff0c;ABC&#xff09;&#xff0c;这么做是为了使…

2014阿里巴巴校园招聘笔试题 - 中南站

转载于:https://www.cnblogs.com/gotodsp/articles/3530329.html

python中一些特殊方法的作用

我们先暂且称呼为特殊方法。 单下划线开头&#xff08;_foo&#xff09;双下划线开头的&#xff08;__foo&#xff09;双下划线开头和结尾的&#xff08; __foo__&#xff09;代表不能直接访问的类属性&#xff0c;需通过类提供的接口进行访问&#xff0c;不能用“from xxx im…

Spring的IOC原理[通俗解释一下]

1. IoC理论的背景 我们都知道&#xff0c;在采用面向对象方法设计的软件系统中&#xff0c;它的底层实现都是由N个对象组成的&#xff0c;所有的对象通过彼此的合作&#xff0c;最终实现系统的业务逻辑。 图1&#xff1a;软件系统中耦合的对象 如果我们打开机械式手表的后盖&am…

python爬虫面试遇到的问题

文章目录&#xff11;python基础1.1 列表生成式和生成器的区别 &#xff1f;1.2 如何不用任何循环快速筛掉列表中的奇数元素 &#xff1f;1.3 map和reduce的用法1.4 装饰器的作用1.5 Python中__new__与__init方法的区别1.6 python中的设计模式1.7 lambda函数&#xff0c;以及它…