有头结点且头结点不存放数据的链表
思路:倒数第k个节点的位置 = 链表总长度size-k
public static void main(String[] args) {
// 初始化链表
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.add(node1);
singleLinkedList.add(node2);
singleLinkedList.add(node3);
singleLinkedList.add(node4);
// 查看链表
singleLinkedList.list();
// 查找单链表中的倒数第k个结点
Node kNode = findLastIndexNode(singleLinkedList, 1);
System.out.println(kNode);
}
/**
* 查找单链表中的倒数第k个结点
* @param singleLinkedList 要进行查找的单向链表
* @param k 传入倒数第几位
* @return 该位置的节点
* 在main 方法调用,所以定义为static
*/
public static Node findLastIndexNode(SingleLinkedList singleLinkedList, int k) {
Node head = singleLinkedList.getHead();
if(head.next == null){
return null;
}
//1. 获得链表的长度(总个数)
int size = singleLinkedList.getLength(head);
//2. k不能为负数以及大于总长度
if(k <= 0 || k > size){
return null;
}
//3. 定义给辅助变量
Node cur = head.next;
//4. 遍历 倒数第K个节点[size-K]的位置
while (size-k != 0){
cur = cur.next;
size--;
}
return cur;
}
/**
* 单向链表:这里定义的单链表是拥有头节点的,且头节点不放数据
*/
public class SingleLinkedList {
//1. 初始化一个头节点,头节点不存放具体数据
private Node head = new Node(0);
//2. 返回头节点
public Node getHead(){
return head;
}
//3. 添加节点
public void add(Node heroNode) {
//因为head节点是不能动的,动了的话链表就找不到入口或者找错路口,所以需要一个辅助节点遍历
Node temp = head;
while (true){
if (temp.next == null) {
temp.next = heroNode;
break;
}
temp = temp.next;
}
}
//4. 显示链表[遍历]
public void list(){
if(head.next == null){
System.out.println("链表为空");
return;
}
Node temp = head.next;
while (true){
if(temp == null){
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
/**
* 链表结点定义
*/
public class Node {
public int val;
//指向下一个节点
public Node next;
//构造器
public Node(int no){
this.val = no;
}
@Override
public String toString() {
return "HeroNode[no=" + val + "]";
}
}