问题:
查找单链表倒数第k个节点
解决方案:
思路
先获取链表的长度length,判断k的合法性,以及k的位置
要找的节点就在length-k处(视情况)
查找倒数第k个节点
/**
* 查找倒数第k个节点
* @param head 链表的头节点
* @param index 表示要查找结点的逆序下标
* @return 返回倒数第index个个点
*/
public Node getK(Node head,int index){
if (head.next == null){
//链表为空
return null;
}
int length = getLength(head);//获取链表的长度
if (index <=0 || index > length){
//判断链表是否合法
System.out.println("index数据非法");
return null;
}
Node temp = head.next;
//遍历到要找的位置
for (int i = 0; i < length-index; i++) {
temp = temp.next;
}
return temp;
}
getLength(head)方法
/**
* 获取单链表的长度
* @param head 单链表的头节点
* @return 返回单链表的有效长度
*/
public int getLength(Node head){
if (head.next == null){
return 0;
}
int length = 0;
Node temp = head.next;
while(temp != null){
length++;
temp = temp.next;
}
return length;
}
完整代码
package LinkedList.test;
/**
* @version 1.0
* @auther WangCode
* @date 2021/4/3 16:08
*/
public class SingleLinkedListTest {
public static void main(String[] args) {
Node n1 = new Node(1, "123");
Node n2 = new Node(2, "23");
Node n3 = new Node(3, "3");
LinkedList linkedList = new LinkedList();
linkedList.add(n1);
linkedList.add(n2);
linkedList.add(n3);
Node listK = linkedList.getK(linkedList.getHead(), 1);
System.out.println(listK);
}
}
//定义一个节点
class Node{
public int no;
public String data;
public Node next;
//构造方法
public Node(int no, String data){
this.no = no;
this.data = data;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", data='" + data + '\'' +
'}';
}
}
//创建单链表
class LinkedList{
//初始化头节点
private Node head = new Node(0,"");
public Node getHead() {
return head;
}
/**
* 添加节点
* @param node
*/
public void add(Node node){
Node temp = head;
while (true){
if (temp.next == null){
//找到链表最后一个节点
break;
}
temp = temp.next;
}
temp.next = node;//在链表的最后添加新的节点
}
/**
* 遍历链表
*/
public void list(){
Node temp = head.next;
if (temp == null){
System.out.println("该链表为空");
return;
}
while(true){
if (temp == null){
break;
}
System.out.println(temp);
temp = temp.next;
}
}
/**
* 获取单链表的长度
* @param head 单链表的头节点
* @return 返回单链表的有效长度
*/
public int getLength(Node head){
if (head.next == null){
return 0;
}
int length = 0;
Node temp = head.next;
while(temp != null){
length++;
temp = temp.next;
}
return length;
}
/**
* 查找倒数第k个节点
* @param head 链表的头节点
* @param index 表示要查找结点的逆序下标
* @return 返回倒数第index个个点
*/
public Node getK(Node head,int index){
if (head.next == null){
return null;
}
int length = getLength(head);
if (index <=0 || index > length){
System.out.println("index数据非法");
return null;
}
Node temp = head.next;
for (int i = 0; i < length-index; i++) {
temp = temp.next;
}
return temp;
}
}
运行结果: