数据结构与算法:单链表面试题(新浪,百度,腾讯)
Posted 温文艾尔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法:单链表面试题(新浪,百度,腾讯)相关的知识,希望对你有一定的参考价值。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、题目
单链表面试题如下:
- 求单链表中有效节点的个数
- 查找单链表中倒数第k个节点【新浪面试题】
- 单链表的反转【腾讯面试题】
- 从尾到头打印单链表【百度面试题:要求方式1:反向遍历。方式2:Stack栈】
- 合并两个有序的单向链表
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、题解
1.求单链表中有效节点的个数
//输出单链表中有效节点的个数
public int listNum(){
if(head.next==null){
System.out.println("无法遍历链表,链表为空!");
return -1;
}
HeroNode2 temp = head;
int sum=0;
while (true){
if (temp.next==null){
break;
}
temp=temp.next;
sum+=1;
}
return sum;
}
2.查找单链表中倒数第k个节点【新浪面试题】
// 查找单链表中倒数第k个节点【新浪面试题】
public void getNode(int k){
if(head.next==null){
System.out.println("链表为空");
return;
}
HeroNode2 temp = head.next;
int length = listNum();//4
if(k<=0||k>length){
System.out.println("无此节点");
}
int key = length-k+1;//k=2 4-2+1
while(key>1){
temp = temp.next;
key--;
}
System.out.println(temp);
}
3.单链表的反转【腾讯面试题】
//单链表的反转
public void ReverseLinkedList(){
if(head.next==null){
System.out.println("链表为空");
return;
}
HeroNode2 reverseNode = new HeroNode2(0,"");
HeroNode2 cur = head.next;
HeroNode2 temp = null;
while(cur!=null){
temp = cur.next;
cur.next = reverseNode.next;
reverseNode.next=cur;
cur=temp;
}
head.next = reverseNode.next;
}
4.从尾到头打印单链表
利用栈的先进后出的特点
利用栈的数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,实现逆序打印
//单链表逆序输出,使用Stack栈
public void listByStack(){
if(head.next==null){
System.out.println("单链表为空");
return;
}
HeroNode2 temp = head;
Stack<HeroNode2> stack = new Stack<>();
while (temp.next!=null){
stack.add(temp.next);
temp=temp.next;
}
while (stack.size()>0){
System.out.println(stack.pop());
}
}
5.合并两个有序的单链表,合并之后的链表依然有序
我们可以使用双指针算法来破解
//合并两个单链表,合并之后依然有序
public LinkedListMove TwoToOne(LinkedListMove list1,LinkedListMove list2,int size1,int size2){
LinkedListMove list3 = new LinkedListMove();
HeroNode2 temp1 = list1.head.next;
HeroNode2 temp2 = list2.head.next;
HeroNode2 temp3 = list3.head;
while(temp1!=null||temp2!=null){
if(temp1==null){
//此时temp2不为空,将temp2中的所有数据放到temp3后面即可
while (temp2!=null){
temp3.next=temp2;
temp3 = temp3.next;
temp2 = temp2.next;
}
break;
}
if(temp1==null){
//此时temp2不为空,将temp2中的所有数据放到temp3后面即可
while (temp1!=null){
temp3.next=temp1;
temp3 = temp3.next;
temp1 = temp1.next;
}
break;
}
if(temp1.no<temp2.no){
temp3.next=temp1;
temp3 = temp3.next;
temp1 = temp1.next;
continue;
}
if(temp2.no<temp1.no){
temp3.next=temp2;
temp3 = temp3.next;
temp2 = temp2.next;
continue;
}
}
return list3;
}
全部代码
package org.wql.LinkedList;
import java.util.Stack;
/**
* Description
* User:
* Date:
* Time:
*/
public class SingleLinkedListTest {
public static void main(String[] args) {
HeroNode2 hero1 = new HeroNode2(1, "aaa");
HeroNode2 hero3 = new HeroNode2(3, "ccc");
HeroNode2 hero7 = new HeroNode2(7, "ccc");
HeroNode2 hero8 = new HeroNode2(8, "ccc");
HeroNode2 hero2 = new HeroNode2(2, "bbb");
HeroNode2 hero4 = new HeroNode2(4, "ddd");
HeroNode2 hero9 = new HeroNode2(9, "ccc");
HeroNode2 hero11 = new HeroNode2(11, "ccc");
LinkedListMove list1 = new LinkedListMove();
list1.add(hero1);
list1.add(hero3);
list1.add(hero7);
list1.add(hero8);
LinkedListMove list2 = new LinkedListMove();
list2.add(hero2);
list2.add(hero4);
list2.add(hero9);
list2.add(hero11);
System.out.println("单链表1:");
list1.list();
System.out.println("单链表2:");
list2.list();
System.out.println("利用双指针算法合并:");
LinkedListMove list3 = list1.TwoToOne(list1, list2, 4, 4);
list3.list();
// LinkedListMove linkedListMove = new LinkedListMove();
// linkedListMove.add(hero1);
// linkedListMove.add(hero2);
// linkedListMove.add(hero3);
// linkedListMove.add(hero4);
// System.out.println("求单链表中有效节点的个数");
// int length = linkedListMove.listNum();
// System.out.println("有效个数为:"+length);
}
}
//对联表进行操作的类
class LinkedListMove{
//头节点
HeroNode2 head = new HeroNode2(0,"");
//在结尾添加节点
public void add(HeroNode2 node){
HeroNode2 temp = head;
while (true){
if (temp.next==null){
temp.next=node;
break;
}
temp=temp.next;
}
}
//按照顺序添加节点
public void addByOrder(HeroNode2 node){
HeroNode2 temp = head;
while (true){
if(temp.next==null){
add(node);
break;
}
if(temp.next.no>node.no){
node.next=temp.next;
temp.next=node;
break;
}
temp=temp.next;
}
}
//遍历单链表
public void list(){
if(head.next==null){
System.out.println("无法遍历链表,链表为空!");
return;
}
HeroNode2 temp = head;
while (true){
if (temp.next==null){
break;
}
temp=temp.next;
System.out.println(temp);
}
}
//输出单链表中有效节点的个数
public int listNum(){
if(head.next==null){
System.out.println("无法遍历链表,链表为空!");
return -1;
}
HeroNode2 temp = head;
int sum=0;
while (true){
if (temp.next==null){
break;
}
temp=temp.next;
sum+=1;
}
return sum;
}
// 查找单链表中倒数第k个节点【新浪面试题】
public void getNode(int k){
if(head.next==null){
System.out.println("链表为空");
return;
}
HeroNode2 temp = head.next;
int length = listNum();//4
if(k<=0||k>length){
System.out.println("无此节点");
}
int key = length-k+1;//k=2 4-2+1
while(key>1){
temp = temp.next;
key--;
}
System.out.println(temp);
}
//单链表的反转
public void ReverseLinkedList(){
if(head.next==null){
System.out.println("链表为空");
return;
}
HeroNode2 reverseNode = new HeroNode2(0,"");
HeroNode2 cur = head.next;
HeroNode2 temp = null;
while(cur!=null){
temp = cur.next;
cur.next = reverseNode.next;
reverseNode.next=cur;
cur=temp;
}
head.next = reverseNode.next;
}
//单链表逆序输出方式一
public void sysLinkedList(){
if(head.next==null){
System.out.println("链表为空");
return;
}
HeroNode2 reverseNode = new HeroNode2(0,"");
HeroNode2 cur = head.next;
HeroNode2 temp = null;
while(cur!=null){
temp = cur.next;
cur.next = reverseNode.next;
reverseNode.next=cur;
cur=temp;
}
System.out.println(reverseNode.next);
}
//单链表逆序输出方式二,使用栈
public void listByStack(){
if(head.next==null){
System.out.println("单链表为空");
return;
}
HeroNode2 temp = head;
Stack<HeroNode2> stack = new Stack<>();
while (temp.next!=null){
stack.add(temp.next);
temp=temp.next;
}
while (stack.size()>0){
System.out.println(stack.pop());
}
}
//合并两个单链表,合并之后依然有序
public LinkedListMove TwoToOne(LinkedListMove list1,LinkedListMove list2,int size1,int size2){
LinkedListMove list3 = new LinkedListMove();
HeroNode2 temp1 = list1.head.next;
HeroNode2 temp2 = list2.head.next;
HeroNode2 temp3 = list3.head;
while(temp1!=null||temp2!=null){
if(temp1==null){
//此时temp2不为空,将temp2中的所有数据放到temp3后面即可
while (temp2!=null){
temp3.next=temp2;
temp3 = temp3.next;
temp2 = temp2.next;
}
break;
}
if(temp1==null){
//此时temp2不为空,将temp2中的所有数据放到temp3后面即可
while (temp1!=null){
temp3.next=temp1;
temp3 = temp3.next;
temp1 = temp1.next;
}
break;
}
if(temp1.no<temp2.no){
temp3.next=temp1;
temp3 = temp3.next;
temp1 = temp1.next;
continue;
}
if(temp2.no<temp1.no){
temp3.next=temp2;
temp3 = temp3.next;
temp2 = temp2.next;
continue;
}
}
return list3;
}
}
class HeroNode2{
int no;
String name;
HeroNode2 next;
public HeroNode2(int no, String name) {
this.no = no;
this.name = nameJava 数据结构——单链表面试题