作者:哇塞大嘴好帥(哇塞大嘴好帅)
Java数据结构链表面试题
4.1.查询链表有效数据个数
//判断有效数据个数
public int validDate(){
//创建临时变量
NodeDate nodeDate = head.next;
//创建计数器 用于记录个数
int count = 0;
while (true){
if (nodeDate == null){
return count;
}
//有效数据个数增加
count++;
//指针下移动
nodeDate = nodeDate.next;
}
}
思路: 定义一个遍历用于记录有效数据的个数,通过循环遍历链表,如果当前节点为NULL那么就证明当节点后就已经没有数据了,就把计数器返回,每次循环如果当前节点不为NULL都要把定义的记录有效数据的个数自增1。
4.2.查询单链表中的倒数第N个节点
//查询倒数第N个节点
public NodeDate daoshumnebt(int index){
//获取有效数据个数
int num = validDate();
//判断数据是否合法
if(index <= 0 || index > num){
return null;
}
//倒数第N个节点的坐标
int Nmenber = num - index;
//创建临时节点
NodeDate temp = head.next;
for (int i = 0 ; i <= Nmenber ; i++){
if (i == Nmenber){
System.out.println(temp);
return temp;
}
temp = temp.next;
}
return temp;
}
首先要获取当前链表的有效数据的个数,接再来在判断数据是否合法,如果要查找的数小于等于0 或者大于有效数据个数就数据有误
接下来通过 num - index获取倒数第N个节点的下标
接接下来在通过for循环,如果当前循环次数==Nmenber就代表找到了此数据。
4.3 链表反向
/**
* 链表反转
* @param linkedlist 需要反转的链表
* @return
*/
public NodeDate reversal(NodeDate linkedlist){
/**
* 判断链表是否为NULL 或者只有一个节点
* 如果只有一个节点或者没有节点就不需要反转直接返回就行
*/
if (linkedlist.next == null || linkedlist.next.next == null){
return linkedlist;
}
//创建临时(指针)变量,遍历链表使用
NodeDate temp = linkedlist.next;
//反转链表
NodeDate reversal = new NodeDate(0,"");
//当前节点的下一个
NodeDate nodenext = null;
//进行反转链表reversal
while(true){
//如果当前节点为NULL就代表到当前链表已经遍历完毕
if (temp == null){
head.next = reversal.next;
return reversal;
}
//保存当前节点的下一个
nodenext = temp.next;
//反转
temp.next = reversal.next;
reversal.next =temp;
//指针下移动
temp = nodenext;
}
}
首先我们进入队列反向会判断链表是否为NULL或者链表是否只有一个元素,如果只有一个元素就不需要反列链表,如果链表为NULL说明链表没有数据。若以上2个需求满足其中一个直接返回传入的链表即可。
接下来创建3个变量,一个为temp(用于遍历链表使用),一个为reversal(存放反向链表后的数据),一个为node(用于保存当前链表的下一个,如果我们不保存,临时变量的下一个节点指向反向链表的下一个,这就会导致我们不能遍历传入的链表)
接下来进行while循环,如果temp == null就代表我们将链表反向的任务完成了。如果没有完成nodenext = 他的下一个节点(获取下一个节点直接temp.next就可以了) 。
接下来进行反转,当前节点的下一个指向反转链表的下一个,反转链表下一个指向当前链表。
依次循环… 直到当前节点的下一个为NULL结束循环
4.4从尾到头打印链表
4.4.1栈(Stack)方法
private NodeDate head = new NodeDate(0,"");
private Stack<String> stack = new Stack<>();
//浏览节点
public void NodeSelct(){
NodeDate temp = head.next;
while(true){
if (temp == null){
break;
}
stack.push(temp.name);
System.out.println(temp.name);
temp = temp.next;
}
while (stack.size() != 0){
String name = stack.pop();
System.out.println(name);
}
}
思路:
首先我们要了解栈,先进后出的原则,意思就是先让进入栈的东西最后出来。
接下来我们遍历链表,将每一次遍历的数据存到到栈里,
当我们将所有数据遍历并且存入栈中后,开始将栈弹出,因为他是先进后出的原则,所以我们就可以实现尾到头打印了。
4.4.2反向遍历
/**
* 链表反转
* @param linkedlist 需要反转的链表
* @return
*/
public NodeDate reversal(NodeDate linkedlist){
/**
* 判断链表是否为NULL 或者只有一个节点
* 如果只有一个节点或者没有节点就不需要反转直接返回就行
*/
if (linkedlist.next == null || linkedlist.next.next == null){
return linkedlist;
}
//创建临时(指针)变量,遍历链表使用
NodeDate temp = linkedlist.next;
//反转链表
NodeDate reversal = new NodeDate(0,"");
//当前节点的下一个
NodeDate nodenext = null;
//进行反转链表reversal
while(true){
//如果当前节点为NULL就代表到当前链表已经遍历完毕
if (temp == null){
head.next = reversal.next;
return reversal;
}
//保存当前节点的下一个
nodenext = temp.next;
//反转
temp.next = reversal.next;
reversal.next =temp;
//指针下移动
temp = nodenext;
}
}
思路 思路跟链表反向一样,将返回的链表循环遍历即可。