1、有效节点的个数,不包含头节点
//查找有效节点数
public int getLength(){
SingleNode tempNode = headNode;
int count = 0;
while (tempNode.next != null){
count++;
tempNode = tempNode.next;
}
return count;
}
2、查找倒数第k个节点
//查找倒数第 k 个节点
public SingleNode reverseFindNode(int k){
SingleNode tempNode = headNode;
if (k > getLength()){
throw new RuntimeException("链表长度为"+getLength()+",不存在此节点");
}
if (k == 0){
throw new RuntimeException("不能为查找倒数第0个节点");
}
for (int i = 0; i < getLength()-k+1; i++) {
tempNode = tempNode.next;
}
return tempNode;
}
3、单链表的反转
//反转链表
public void turnLinkedList (){
if ( getLength() <= 1){
return;
}
SingleNode tempNode = headNode.next;
SingleNode tempNode2 = null;
SingleNode reverseHead = new SingleNode(0, "");
while (tempNode != null){
//保存当前节点的下一个节点,防止链表断裂
tempNode2 = tempNode.next;
//让当前节点指向反向节点头的下一个节点,因为上面保存了此节点的下一个节点,所以才可以放心赋值
tempNode.next = reverseHead.next;
//然后让反向链表的头指向当前节点
reverseHead.next = tempNode;
//让临时节点指向下一个需要头插的节点
tempNode = tempNode2;
//头插完成,此时t1 t2 指向的都是原链表当前节点的下一个节点,下次循环开始的时候t2又会往后指一个节点
}
//这时让原链表的头指向反转了的链表的第一个节点即reverseHead.next,即原头代替反向临时头
headNode.next = reverseHead.next;
}
4、利用 栈 反向打印链表
//反向打印链表,不破坏原有结构
public void reversePrint(){
Stack<SingleNode> nodesStack = new Stack<>();
SingleNode tempNode = headNode;
while (tempNode.next != null){
nodesStack.push(tempNode.next);
tempNode = tempNode.next;
}
while (nodesStack.size() > 0){
System.out.println(nodesStack.pop());
}
}