链表及相关面试题

news/2025/1/11 5:06:16/

链表

单链表

特点:

  • 逻辑上顺序存储,物理上无序存储
  • 头指针根据情况而定,不保存数据,很多操作需要头指针,比如原地反转链表。
  • 每个节点包含 data, Node next保存下个Node
public class LinkList {public Node header=new Node();add{}query{}....
}public class Node{String data;Node next;Node(Sring data){this.data=data;}
}

常见操作:增删改查。

单链表面试题

1 求链表中的有效节点数?

思路 1:while(true)遍历该链表 直到next==null break,否则Count++

思路 2:设置两个节点,Fir 走一步,Sec 走两步,

​ 当 Sec.next==null retrun Fir步数 * 2+1

​ 当 Sec.next.next==null retrun (Fir步数+1) * 2

2 查找单链表中倒数第K个节点。

思路 1:遍历两次,第一次得到链表长度L,第二次遍历到L-K

思路 2: 设置两个节点,第一个节点先走K步,第二个节点在一起走,当第一个节点next==null时,第二个节点正好是倒数第K个节点。

3 单链表的反转

思路 1:在创建一个头结点,遍历该链表的过程中利用头插法,移动到一个新的头节点上,最后再把原来的头结点指向创建的头结点的next。

思路 2:原地腾转移诺法。

header -> h1 -> h2 -> h3…

h1=header.next;
temp=header;
while(h1.next!=null){temp.next=h1.next;h1.next=h1.next.next;h1.next.next=h1;temp=temp.next;
}

4 从尾到头打印单链表

思路 1:反转链表后输出,不推荐。改变了原来数组的结构。

思路 2:利用栈,对链表进行遍历[^ 不香吗 ]。

双向链表

双向链表的结构

public class Linklist(){private Node header=new Node(null,null,null);Node getheader(){retrun header;}add(Node node){...}...
}
class Node(){String value;Node next;Node pre;//构造器Node(...){...}String toString(){....}}

双向链表的增删改查:

  • 增加
  • 删除
  • 修改
  • 查询

环形单链表

引入问题约瑟夫

第一步: 实现环形链表的建立

输入一个值k,创建一个值为1-k环形链表

思路:

  • 如果k=1 让它自己指向它自己return;
  • 如果k>1,先new Node( 1 ),然后创建变量temp,进行k-1次循环,temp总是指向当前循环的最后一个元素。
 static Node init(int k){Node fir=new Node(1);if(k==1){fir.next=firreturn fir;}Node temp=fir;for (int i = 2; i <=k; i++) {Node node=new Node(i);temp.next=node;node.next=fir;temp=node;}return fir;}

第二步:遍历约瑟夫环

思路

  • 进行k次循环,需要temp遍历。

第三步:按m步遍历约瑟夫环

思路:

  • 如果m=1
  • 如果m!=1循环k次,让它走m-2步,即走到需要删除的节点的前一个节点。
    static void game(Node fir,int k,int m){Node temp=fir;if(m==1){while (true){if(temp.data== temp.next.data){System.out.println(temp.data);return;}System.out.println(temp.next.data);temp.next=temp.next.next;}}for (int i = 0; i < k; i++) {for (int j = 0; j < m; j++) {if (j==m-2){System.out.println(temp.next.data);temp.next=temp.next.next;temp=temp.next;break;}temp=temp.next;}}}

http://www.ppmy.cn/news/297391.html

相关文章

【新星计划回顾】第五篇学习计划-数据库开启定时任务知识点

&#x1f3c6;&#x1f3c6;时间过的真快&#xff0c;这是导师回顾新星计划学习的第五篇文章&#xff01;本篇文章主要是承接上一篇学习计划&#xff0c;通过开启定时任务进行模拟生成数据&#xff0c;实际开发项目中&#xff0c;可能会用到其他方式&#xff01; 最近这段时间非…

windows服务器自带IIS搭建网站并发布公网访问的详细教程

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如…

protobuf实现原理

文章目录 一、前言二、概述三、数据存储方式&#xff1a;Varints(一)原理(二)举例(三)缺点 四、协议的数据结构(一)原理(二)举例 一、前言 最近刚刚从一家公司离职&#xff0c;在职的时候使用到了go语言的grpc库&#xff0c;了解了除了json之外的另一个专门用于远程调用的序列…

NLP——part of speech (POS)中的隐马尔可夫模型 + Viterbi 算法

文章目录 POS隐马尔可夫模型计算简介转移概率矩阵&#xff08;Transition matrix&#xff09;观察矩阵&#xff08;Observation / emission Matrix&#xff09;预测 predictionVitervi 算法练习 POS 词性标注&#xff08;Part-of-Speech Tagging&#xff0c;POS Tagging&#…

虚拟ip设置 - Keepalived详解

1. ubuntu安装keepalived&#xff08;需要偏移的机器&#xff09; rootubuntu:~# apt install keepalived2. 编写配置文件/etc/keepalived/keepalived.conf&#xff08;需要偏移的机器&#xff09; rootubuntu:~# cd /etc/keepalivedrootubuntu:/etc/keepalived# vi keepaliv…

数据库实验七(SQL Server SSMS)

实验要求 运行环境 SQL Server 2022SQL Server Management Studio Management Studio 19 本实验的全部SQL脚本 -- 第一题 create function func1(coursename char(30)) -- 定义函数 returns float as begindeclare avg_score floatselect avg_score avg(score) from sc, cw…

keepalived配置虚拟IP

YUM安装 # yum安装 yum -y install keepalived # 查看安装版本 rpm -qa keepalived # 查看安装路径 rpm -ql keepalived或是使用源码安装 到这里下载 https://www.keepalived.org/download.html # 安装依赖 yum -y install gcc openssl-devel libnfnetlink-devel 下载源码包…

IP反查域名

IP反查域名 ip反查域名的三种方法&#xff0c;方法有很多&#xff0c;我这边只描述三种&#xff0c;也算是两种 1&#xff0c;在线网站 http://stool.chinaz.com/same 2&#xff0c;在线网站 https://site.ip138.com/ 3&#xff0c;工具 https://github.com/Sma11New/ip2domain…