求单链表中有效节点的个数
思路
- 情况一,空链表怎么样
- 情况二,非空链表,设置计数器,遍历数组
我的代码
public int nodeNumber(){
HeroNode temp = head;
int number = 0;
while (true){
if(temp.next == null){
break;
}
number ++;
temp = temp.next;
}
return number;
}
教程代码:
public static int getLength(HeroNode head){
//判断是否为空链表
//定义一个辅助变量,计数器
//遍历链表,如不为空计数器加一
if(head.next == null){
System.out.println("链表为空,节点数为零");
return 0;
}
int counter = 0;
HeroNode cur = head.next;
while (cur != null){
counter ++ ;
cur = cur.next;
}
return counter;
}
总结:
1、 考虑的更加全面,我没有考虑到空链表的情况
2、逻辑更加清晰,遍历,当前节点为空跳出循环,不为空计数器加一。我的遍历只是为了找尾节点。
查找单向链表中倒数第K个节点
思路:
- 编写一个方法,接受头节点,同时接受一个index,index是倒数第index个节点
- 从头到尾遍历,得到总长度
- 从头开始遍历,遍历(size - index)个之后,即可得到
- 如果找到了,返回该节点,否则返回null
代码实现
我的代码:
public void search(int k){
HeroNode temp = head.next;
int Length = this.nodeNumber();
int counter = 0;
while (true){
counter ++;
if(counter == (Length - k + 1)){
break;
}
if(temp.next == null){
break;
}
temp = temp.next;
}
System.out.println(temp);
}
教程代码:
自己的代码:
public void search(int k){
HeroNode temp = head.next;
int Length = this.nodeNumber();
int counter = 0;
while (true){
counter ++;
if(counter == (Length - k + 1)){
break;
}
if(temp.next == null){
break;
}
temp = temp.next;
}
System.out.println(temp);
}
教程代码:
public static HeroNode findLastIndexNode(HeroNode head ,int index){
//判断链表是否为空
if(head.next == null){
System.out.println("链表为空!");
}
//根据已有方法得到链表的长度
int size = getLength(head);
//校验所给index是否有效
if(index < 0 || index > size){
System.out.println("所输入的索引无效");
}
//然后遍历length - index次
HeroNode temp = head.next;
for(int i = 0 ;i < (size - index);i ++){
temp = temp.next;
}
return temp;
}
总结:
1、未考虑所给链表为空,未考虑所给索引是否为有效值的情况
2、思路更清晰,遍历的方式更加灵活
3、应当注意,是从头节点的下一个节点,第一个有效节点开始遍历的
单链表的反转
思路实现:
- 定义一个新的头节点 reverseHead
2.从头到尾遍历原来的节点,每遍历一个节点将其取出,并且放在新的链表的reverseHead的最前端 - 原来链表的head.next = reverseHead.next
我的代码
第一次:
public void reverse(){
HeroNode temp = head;
HeroNode temp1 = temp.next;
HeroNode temp2 = temp.next.next;
temp1.next = temp;
//temp.next = null;
temp.next = temp;
temp2.next = temp;
temp1 = temp.next;
temp1 = temp.next;
temp.next = temp2;
temp2 = temp1.next;
temp1.next = temp;
画了小半张纸,以为只能在原来的链表上进行修改
第二次:
public static void reverse(HeroNode head){
//思路实现
//定义一个新的头节点reverseHead
HeroNode reverseHead = new HeroNode(0,"","");
//从头到尾遍历原来的节点,没遍历一个节点将其取出,并且放在新的链表的reverseHead最前端
HeroNode temp = head;
HeroNode temp2;
while (temp != null){
temp = head.next;
head.next = head.next.next;
temp2 = reverseHead.next;
reverseHead.next = temp;
temp.next = temp2;
}
//原来的链表head.next = reverseHead.next
head.next = reverseHead.next;
}
没加if之前是空指针异常,加了if之后是死循环
教程代码:
public static void reverse(HeroNode head){
//思路实现
//定义一个新的头节点reverseHead
HeroNode reverseHead = new HeroNode(0,"","");
//从头到尾遍历原来的节点,没遍历一个节点将其取出,并且放在新的链表的reverseHead最前端
HeroNode temp = head.next;
HeroNode next = null;
while (temp != null){
next = temp.next;
temp.next = reverseHead.next;
reverseHead.next = temp;
temp = next;
}
head.next = reverseHead.next;
}
总结:
- 自己创建了一个节点来保存temp之后的节点,没有用头节点
- 直接把reversehead后面的节点赋给新转移的节点temp,没有像我一样在创建一个新的节点来保存。