①求单链表中有效节点的个数(如果带头节点的链表,不统计头节点)
public static int getLength ( HeroNode head) {
if ( head. next == null) {
return 0 ;
}
int length = 0 ;
HeroNode cur = head. next;
while ( cur != null) {
length++ ;
cur = cur. next;
}
return length;
}
②查找单链表中的倒数第K个节点
思路分析:从头开始遍历,得到总长度,从第一个开始遍历,( 总长度-k) 就可以得到
public static HeroNode findLastIndexNode ( HeroNode head, int index) {
if ( head. next == null) {
return null;
}
int size = getLength ( head) ;
if ( index < 0 || index > size) {
return null;
}
HeroNode node = head. next;
for ( int i = 0 ; i < size - index; i++ ) {
node = node. next;
}
return node;
}
③单链表的反转
思路:( 1) 先定义一个节点,reverseHead = new HeroNode( ) ;
( 2) 从头遍历原来的链表,每遍历一个节点,就将其取出,并放到新的链表reverseHead的最前端( 始终放到最前面)
( 3) 原来的链表的head.next = reverseHead.next
public static void reverseList ( HeroNode head) {
if ( head. next == null || head. next. next == null) return ;
HeroNode temp = head. next;
HeroNode next = null;
HeroNode reverse = new HeroNode ( 0 , "" , "" ) ;
while ( temp != null) {
next = temp. next;
temp. next = reverse. next;
reverse. next = temp;
temp = next;
}
head. next = reverse. next;
}
④从尾到头打印单链表
思路:
方式1:先将单链表进行反转操作,然后再遍历即可( 破环原来链表的结构,不建议)
方式2:可以利用栈这个数据结构,将各个节点压入到栈中,利用栈的先进后出的特点,就实现了逆序打印的效果
public static void reversePrint ( HeroNode head) {
if ( head. next == null) {
return ;
}
HeroNode temp = head. next;
Stack< HeroNode> stack = new Stack < > ( ) ;
while ( temp != null) {
stack. push ( temp) ;
temp = temp. next;
}
while ( stack. size ( ) > 0 ) {
System. out. println ( stack. pop ( ) ) ;
}
}
⑤合并两个有序的单链表
思路分析:
1) 获得head1和head2中数据值较小的节点,并设置为合并后链表的首节点
2) 通过循环,依次获得链表1和链表2中数据值较小的节点,并添加到合并后链表的末尾
3) 当步骤2执行完毕,如果某一个链表中的首节点不为null,则将该链表首节点及其之后的节点添加到合并后链表的末尾.
public static HeroNode mergeList ( HeroNode node1, HeroNode node2) {
if ( node1. next == null && node2. next == null) {
return null;
}
if ( node1. next == null) {
return node2;
}
if ( node2. next == null) {
return node1;
}
HeroNode heroNode = new HeroNode ( 0 , "" , "" ) ;
HeroNode node = heroNode;
HeroNode temp1 = node1. next;
HeroNode temp2 = node2. next;
while ( temp1 != null && temp2 != null) {
if ( temp1. no < temp2. no) {
node. next = temp1;
temp1 = temp1. next;
} else {
node. next = temp2;
temp2 = temp2. next;
}
node = node. next;
}
if ( temp1 == null) {
node. next = temp2;
}
if ( temp2 == null) {
node. next = temp1;
}
return heroNode;
}