这次单链表的代码包含增加、删除、修改、打印链表信息的方法以及运用这些方法,完成部分很简单的面试题,也是跟着视频学,自己理解后再敲代码。代码如下:
public class SingleLinkedListdemo {
public static void main(String[] args) {
// 基本数据准备
Heronode hero1=new Heronode(1,"宋江","及时雨");
Heronode hero2=new Heronode(2,"卢俊义","玉麒麟");
Heronode hero3=new Heronode(3,"吴用","智多星");
Heronode hero4=new Heronode(4,"林冲","豹子头");
//创建链表
SingleLinkedList singleLinkedList=new SingleLinkedList();
//加入节点
singleLinkedList.add(hero1);
singleLinkedList.add(hero2);
singleLinkedList.add(hero3);
singleLinkedList.add(hero4);
singleLinkedList.list();//打印链表信息
System.out.println("-----------------------------------------------------------------------");
System.out.println("修改节点信息操作");
//修改节点信息
Heronode newhero=new Heronode(2,"小卢","玉麒麟_");
singleLinkedList.update(newhero);
singleLinkedList.list();//打印链表信息
System.out.println("-----------------------------------------------------------------------");
System.out.println("删除节点信息操作");
//删除节点
singleLinkedList.delete(4);//删除no为4号的节点
singleLinkedList.list();//打印链表信息
System.out.println("-------------------------------------------------------------------");
// --------------------------------------分割线-----------------------------------------------
System.out.println("面试题");
System.out.println("1.有效节点个数为:"+getlength(singleLinkedList.gethead()));
System.out.println("2.获取倒数第K个节点(新浪面试题)");
System.out.println("链表信息如下");
singleLinkedList.list();
int index=3;//设置寻找倒数第index的值
Heronode res= findLastNode(singleLinkedList.gethead(),index);//获取倒数第1(index)个
System.out.println("倒数第"+index+"信息为"+"res="+res);
System.out.println("------------------------------------");
System.out.println("3.单链表的反转(腾讯面试题)");
System.out.println("原来链表的情况");
singleLinkedList.list();
System.out.println("链表反转后的情况");
reverseList(singleLinkedList.gethead());
singleLinkedList.list();
}
/** getlength()方法获取单链表节点个数
* @param head 链表头节点
* @return 返回节点个数
*/
public static int getlength(Heronode head){
if(head.next==null){
System.out.println("链表为空");
}
int length=0;
Heronode temp=head.next;
while(temp!=null){
length++;
temp=temp.next;
}
return length;
}
/**
*findLastNode()找倒数第index个节点
* @param head 头节点
* @param index 坐标
* @return
*/
public static Heronode findLastNode(Heronode head,int index){
if(head.next==null){
System.out.println("寻找倒数第K个节点时:链表为空");
}
//得到链表的长度length
int length = getlength(head);
//遍历到length-index位置,该位置就是倒数的第index个节点
//校验index
if(index<=0 ||index >length){
System.out.println("无效位置index");
return null;
}
//定义辅助变量
Heronode temp = head.next;
for (int i=0;i<length-index;i++){
temp=temp.next;
}
return temp;
}
/**
* 单链表反转(腾讯面试题)
* @param head 头节点
*/
public static void reverseList(Heronode head){
//思路:从头到尾遍历原来链表,每遍历一个节点,就将当前节点转移到新链表中的最前端,最后遍历完成后,新链表就是旧链表的反转。
if(head.next==null||head.next.next==null){//当前链表为空,或者只有一个节点
return;
}
Heronode temp=head.next;//辅助变量,遍历原来的链表
Heronode next=null;//指向原来链表中当前准备移动到新链表的节点的下一个节点,如果没有next指向下一个节点,移动当前节点后,后面的节点就会丢失。
Heronode reverseHead =new Heronode(0,"","");//新链表的头节点
//遍历原来链表并转移节点到新链表
while(temp!=null){
next=temp.next;//保存当前节点的下一个节点,否则就会丢失
temp.next=reverseHead.next;//将当前节点的next指向新链表中第一个节点
reverseHead.next=temp;//再将新链表中头节点的next(类似指针)指向当前节点,到这里就相当将节点转移到新链表的最前端。
temp=next;
}
head.next=reverseHead.next;//新链表连接到旧链表中的头节点,实现反转
}
}
class Heronode{//定义类
public int no;
public String name;
public String nickname;
public Heronode next;//指向下一个节点
//构造器
public Heronode(int no,String name,String nickname){
this.no=no;
this.name=name;
this.nickname=nickname;
}
//重构显示方法
public String toString(){
return "HeroNode[no="+no+",name="+name+",nickname="+nickname+",next="+next+"]";
}
}
//
class SingleLinkedList{
//初始化头节点
private Heronode head=new Heronode(0,"","");
//获取单链表的头节点
public Heronode gethead(){
return head;
}
//添加节点到单向链表
public void add(Heronode heronode){
Heronode temp=head;
while(temp.next!=null){//移动到最后的节点,
temp=temp.next;
}
temp.next=heronode;//链尾添加新节点
}
//打印链表所有节点
public void list(){
if(head.next==null){
System.out.println("链表为空");
return;
}
Heronode temp=head.next;
while(temp!=null){
System.out.println(temp.toString());
temp=temp.next;
}
}
//修改节点数据(根据no编号)
public void update(Heronode heronode){
//判断链表是否为空
if(head.next==null){
System.out.println("链表为空");
return;
}
//寻找要修改的节点(已经确定链表有节点)
Heronode temp=head.next;//定义辅助变量
boolean flag=false;//标记是否找到指定节点
while(true){
if(temp==null){
System.out.println("没有指定的节点");
break;
}
if(temp.no==heronode.no){
flag=true;//找到节点,标记设置为true
break;
}
temp=temp.next;
}
//flag为true,证明有指定节点,修改信息
if(flag){
temp.name=heronode.name;
temp.nickname= head.nickname;
}
}
//删除节点
public void delete (int no){
//寻找要修改的节点
Heronode temp=head;//定义辅助变量
boolean flag=false;//标记是否找到指定节点
while(true){
if(temp.next==null){//一开始只有头节点,无法删除,退出循环或者有节点但没有找到,已经到链表最后,退出循环
System.out.println("没有指定的节点");
break;
}
if(temp.next.no==no){
flag=true;//找到节点,标记设置为true
break;
}
temp=temp.next;
}
//flag为true,证明有指定节点,删除节点
if(flag){
temp.next=temp.next.next;
}
}
}