本文共 2303 字,大约阅读时间需要 7 分钟。
输入一个链表,输出该链表中倒数第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); } }}结果: