单链表练习(1)

101 阅读2分钟

“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

1>求单链表中有效节点的个数

1> 思路分析:获取到单链表的节点个数,若有头结点则不统计头结点

代码实现:


if (head.next==null) {//空链表

return 0;

}

//定义长度

int length=0;

//定义辅助长度

HeroNode cur=head.next;

while(cur!=null) {

length++;

cur=cur.next; //遍历

}

return length;

}

2>查找单链表中的倒数第k个节点

2>思路分析:1.在上传节点的同时,要给一个index值,这个index值代表着倒数第几个节点

2.将链表进行遍历,然后统计出共有几个节点getlength

3.得到长度后,再用(长度-index),即可得到要找的节点

4.若找到返回该节点,找不到则返回空值

代码实现:

//获取到单链表的倒数第k个节点


if (head.next==null) {//空链表

return null;

}

//第一次变量得到长度个数

int length=getlength(head);

//先判断一下index输入的有没有问题

if(index<=0||index>length) {

System.out.println("index输入错误");

return null;

} else {

//第二次变量到length-index位置,就是我们要找的k节点

//定义辅助变量

HeroNode cur=head.next;

int i=0;

while(i<length-index) {

i++;

cur=cur.next; //遍历

}

return cur;

}

}

3>单链表的翻转

3>思路分析:1.先定义一个节点reservedHead=new HeroNode();

2.从头到尾遍历节点,每遍历一个节点,就将其取出,放在新的链表head的最前端(将新链表.next=旧的链表,reservedHead.next=新链表),先更新节点的next域,之后带着后面的数据再确定位置

3.用head指向新的节点

代码实现


if (head.next==null||head.next.next==null) {

//空链表和单个链表无需判断

return;

}

HeroNode reservedhead=new HeroNode(0, null, null);

HeroNode cur=head.next;  //帮助遍历链表

HeroNode next=null;//指向当前节点cur的下一个节点

//遍历原来链表,并将最新的节点放在最前面

while (cur!=null) {

next=cur.next; //先暂时保存当前节点的下一个节点,因为后 面需要使用

//下面两行不可替换原因,若替换会把反向链表搞断,链表顺序 调整,先确定节点的next域,之后带着后面的数据再确定位置

cur.next=reservedhead.next;//将cur的下一个节点指向新的 链表的最前端

reservedhead.next=cur;//将后面的链表链接起来

cur=next;//让next后移

}

//将head.next指向reservedhead.next,实现单链表的翻转

head.next=reservedhead.next;

}

}