/**
*获取到单链表的节点的个数
* @param head
* @return 返回的就说有效节点的个数
*/

public static int getLength(HeroNode head){
if (head.next == null) {
return 0;//带头结点的空链表 不要统计头节点重要
}
int length=0;
HeroNode temp = head.next;//临时的要定义成next
while (temp != null) {
length++;
temp=temp.next;

}
return length;
}

System.out.println(getLength(singleLinkedList.getHead())+"返回的有效节点个数");

   3 返回的有效节点个数

----------------------------------------------------------------------------------------------------------------
/**
* 查找单链表中倒数第K个节点
* 接受head节点 ,同时接受一个index
* index:表示是倒数第index个节点
* 先把链表从头到尾遍历,得到链表的总的长度 (getlengh就行)
* 得到size后,从链表的第一个开始遍历(size-index)个,就可以得到
*/
public static HeroNode findLastIndexNode(HeroNode head,int index){
//如果链表为空 ,返回null
if (head.next == null) {
return null;//没有找到
}
//第一个遍历得到链表的长度(节点个数)
int length = getLength(head);
HeroNode temp = head.next;//辅助变量指向第一个变量,而不是头节点
//第二次白遍历 size-index位置,就说我们倒数的第k个节点
if (index <= 0 || index > length) {
return null;
}
for (int i = 0; i <length-index; i++) {
temp=temp.next;//三个节点 ,遍历两次
}
return temp;

}

HeroNode heroNode = findLastIndexNode(singleLinkedList.getHead(),2);
System.out.println(heroNode);

 HeroNode{no=3, name='吴用', nickName='智多星'}


----------------------------------------------------------------------------------------------------------------

 链表面试题_单链表反转

 

 链表反转思路

原链表head.next获取,然后连接到下面得reverseHead节点 , temp连接上下一个节点

链表面试题_有效节点_02

 

数据5拿出来指向数据二,连接到reversehead节点后面,

链表面试题_数据_03

 

 

 把便利的最后一个放到5之前,reverseHead后面 ,同时9.next不为空,变为5  ,同时head指向9(reverseHead的下一个节点)

 

 链表面试题_链表_04

 

 


/**
* 单链表的反转
* 1.先定义一个节点 reverseHead = new HeroNode();
* 2.从头到位遍历原来的链表,没遍历一个节点,就将其取出,并放在新的链表的最前端
* 3.原来的链表的head.next = reverseHead.next
*/
public static void resersetList(HeroNode head){
//如果当前链表为空,或者只有一个节点,无需反转,直接返回
if(head.next==null||head.next.next==null){
return;
}//定义一个辅助指针 都是第一个节点开始
HeroNode temp = head.next;
//防止链表断裂,需要定一个next.next记录
HeroNode next = null;
HeroNode reverseHead = new HeroNode(0,"","");
//并从头开始遍历原先链表
while (temp!=null){//temp不为空才循环
next=temp.next;//保留当前节点的下一个节点 5的下一个节点是2
// reverseHead.next=temp;
temp.next=reverseHead.next;//将temp的下一个节点指向新的链表的最前端 本来是re.next指向5,现在给到9
reverseHead.next=temp;//将temp连接到新的链表上
temp = next;//temp后移
//实现单链表反转
head.next=reverseHead.next;//最后把re.next直接给head.next

}
}