单链表的常见面试题有如下:
- 求单链表中有效节点的个数
- 查找单链表中的倒数第k个结点 【新浪面试题】
- 单链表的反转【腾讯面试题,有点难度】
- 从尾到头打印单链表 【百度,要求方式1:反向遍历 。 方式2:Stack栈】
- 合并两个有序的单链表,合并之后的链表依然有序【课后练习.】
package com.m.demo4;
import java.util.Stack;
public class linkedList {
/**
* 求单链表中有效节点的个数
* 查找单链表中的倒数第k个结点 【新浪面试题】
* 单链表的反转【腾讯面试题,有点难度】
* 从尾到头打印单链表
* 【百度,要求方式1:反向遍历 。 方式2:Stack栈】
* 合并两个有序的单链表,合并之后的链表依然有序【课后练习.】
*/
// 求单链表中有效节点的个数 :遍历一遍
public static int getNum(Node head) {
int sum=0;
Node temp=head;
while(true) {
if(head.next==null) {
return 0;
}
if(temp.next==null) {
break;
}
temp=temp.next;
sum++;
}
return sum;
}
// 查找单链表中的倒数第k个结点 【新浪面试题】先遍历一遍,正序:num-k
public static Node getK(Node head,int k) {
Node temp=head;
int size=getNum(temp);
if(k>size||k==0) {
System.out.println("不存在k节点");
return null;
}
for(int i=0;i<=size-k;i++) {
temp=temp.next;
}
return temp;
}
// 单链表的反转【腾讯面试题,有点难度】:重新建一个链表
public static void setReversal(Node head) {
Node temp=head.next;
Node tnext;//用来记录temp的下一个节点
Node newNode=new Node(0,"");
while(true) {
if(head.next==null) {
System.out.println("链表为空");
break;
}
if(temp==null) {
break;
}
//开始建立新链表:
// temp=temp.next;
tnext=temp.next;
temp.next=newNode.next;
newNode.next=temp;
temp=tnext;
}
head.next=newNode.next;
}
// 从尾到头打印单链表:使用栈的方式 先进后出
public static void getPrint(Node head) {
Stack<Node> stack=new Stack<Node>();
Node temp=head.next;
// 入栈
while(true) {
if(head.next==null) {
System.out.println("链表为空");
break;
}
if(temp==null) {
break;
}
stack.push(temp);
temp=temp.next;
}
// 出栈
// System.out.println(stack.pop());
// for(int i=0;i<getNum(head);i++) {
// System.out.println(stack.pop());
// }
while(stack.size()>0) {
System.out.println(stack.pop());
}
}
// 合并两个有序的单链表,合并之后的链表依然有序:将链表2插入链表1
public static Node getMerge(Node head1,Node head2) {
Node temp2=head2.next;
Node tnext2;//记录链表2 head 的下一个
if(head1.next==null) {//如果head1为空,直接返回head2
head1.next=head2.next;
return head1;
}
if(head2.next==null) {
System.out.println("链表2为空");
return head1;
}
while(true) {
tnext2=temp2.next;
if(temp2==null) {
break;
}
// 找链表1插入的位置
Node temp1=head1.next;
boolean flag=false;//记录位置
while(true) {
if(temp1==null||temp1.next==null) {
break;
}
if(temp1.next.id>=temp2.id) {
flag=true;
temp2.next=temp1.next;
temp1.next=temp2;
break;
}
temp1=temp1.next;
}
if(flag==false) {//链表1没有比这个数大的
temp1.next=temp2;
break;
}
// temp2=temp2.next;
temp2=tnext2;
}
return head1;
}
}