题目描述:
输入一个链表,输出该链表中倒数第k个节点。
解题方案:
让链表从头开始走到尾,每移动一步,就让k的值减1。
①假设链表为1-2-3,k=4,链表根本不存在倒数第4个节点。
走到的节点为:1-2-3
k的变化为:3 2 1
②假设链表为1-2-3,k=3,链表的倒数第3个节点是3
走到的节点为:1-2-3
k的变化为:2 1 0
③假设链表为1-2-3,k=2,链表的倒数第2个节点是2
走到的节点为:1-2-3
k的变化为:1 0 -1
以上三种情况,如果k值大于0,说明找不到倒数第k个节点,k值比链表长度还大;如果k值等于0,说明链表的头节点就是倒数第k个节点;如果k值小于0,那么这种情况怎么处理?
首先当从头到尾走一遍后,每移动一步k值减1,k值变为k-N(N是链表长度),那么让当前的k值重新从头节点走一遍,每移动一步就让k值加1,当k值为0时,则为N-k节点,即为所要找的倒数第k个节点的前一个节点。
核心代码实现如下:
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k < 1){
System.out.println("链表为空或者k值小于1!");
return null;
}
ListNode cur = head;
while(cur != null){
k--;
cur = cur.next;
}
if(k > 0){
System.out.println("k值大于链表长度!");
return null;
}else if(k == 0){
return head;
}else{
cur = head;
while(++k != 0){
cur = cur.next;
}
}
return cur.next;
}
测试代码:
class LinkList{
public ListNode head;
private int length;
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public LinkList(){
head = null;
length = 0;
}
// 将节点追加到链表的末尾
public void appendLast(int value) {
ListNode node = new ListNode(value);
if(head == null){
head = node;
length++;
return;
}
ListNode cur = head;//当前节点
while(cur.next != null){
cur = cur.next;
}
cur.next = node;
length++;
}
public void printList(){
ListNode cur = head;
while(cur != null){
System.out.print(cur.val + " ");
cur = cur.next;
}
}
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k < 1){
System.out.println("链表为空或者k值小于1!");
return null;
}
ListNode cur = head;
while(cur != null){
k--;
cur = cur.next;
}
if(k > 0){
System.out.println("k值大于链表长度!");
return null;
}else if(k == 0){
return head;
}else{
cur = head;
while(++k != 0){
cur = cur.next;
}
}
return cur.next;
}
}
public class FindKthToTail {
public static void main(String[] args) {
LinkList list = new LinkList();
list.appendLast(1);
list.appendLast(2);
list.appendLast(3);
list.appendLast(4);
list.appendLast(5);
list.appendLast(6);
list.appendLast(7);
list.appendLast(8);
list.printList();
System.out.println();
LinkList.ListNode ret = list.FindKthToTail(list.head, 1);
if(ret == null){
System.out.println("链表有错误或者K值设置不对!");
}else{
System.out.println(ret.val);
}
}
}
结果: