几道面试题
1.查找倒数第几个
//题目2:查找获取单链表倒数第index个结点
//1.编写一个方法接收head结点,接收一个index(表示倒数第index个结点)
//2.先把链表从头到尾遍历,得到链表长度length
//3.得到length后,从链表第一个开始遍历,遍历length-index个
public static HeroNode FindLastNode(HeroNode head,int index) {
//判断链表是否为空
if(head.next==null) {
return null;
}
int length = getLength(head);
if(index<=0 || index>length) {
return null;
}
HeroNode temp = head.next;
for(int i =0;i< length - index;i++) {
temp = temp.next;
}
return temp;
}
这题难度在于设置循环参数,需要举例子,比如共有5个结点,要倒数第二个,那么得到length=5之后,从第一个开始遍历,遍历5-2=3个结点,每个结点指向后继然后返回最后的这个结点
2.单链表反转
//题目3:单链表反转
public static void reverseList(HeroNode head) {
//判断是否为空 如果是空或者只有一个结点则不用反转
if(head.next == null || head.next.next==null) {
return;
}
HeroNode temp = head.next;
HeroNode next = null;//定义指向当前结点temp的下一个结点
HeroNode reverseHead = new HeroNode(0, null, null);
//遍历原来的链表 把结点插入新链表的头部
while(temp!=null) {
next = temp.next;
temp.next = reverseHead.next;
reverseHead.next=temp;
temp = next;
}
//将head指向新的链表头部
head.next = reverseHead.next;
}
思路就是新建一个头部结点,将之前链表的结点依次插入头部位置,这样的话相当于是逆序排列了一遍,next是用来遍历原来链表的,如果没有next的话,将结点插入后,就找不到之后的索引了。
3.语法示例
//题目4:逆序打印链表 使用栈
public static void reversePrint(HeroNode head) {
if(head.next==null) {
return;
}
Stack<HeroNode> stack = new Stack();
HeroNode temp = head.next;
while(temp!=null) {
stack.push(temp);
temp = temp.next;
}
while(stack.size()>0) {
System.out.println(stack.pop());
}
}
这里使用了util类的stack类,也就是栈,利用了栈结构先进后出的性质,将链表结点压入栈,这样第一个pop出来的就是原来的最后一个,实现了逆序打印
4.合并有序链表
//题目5:合并两个有序单链表
public static HeroNode CombineNode(HeroNode head1,HeroNode head2) {
HeroNode newNode = new HeroNode(0,null,null);
HeroNode temp = newNode.next;
while(head1!=null&&head2!=null) {
if(head1.no>head2.no) {
temp.next=head2;
temp = temp.next;
head2 = head2.next;
}else {
temp.next=head1;
temp = temp.next;
head1 = head1.next;
}
}
if(head1==null) {
temp.next = head2;
}
if(head2==null) {
temp.next = head1;
}
return newNode;
}