剑指Offer14链表中倒数第k个结点
Posted blog-cpc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer14链表中倒数第k个结点相关的知识,希望对你有一定的参考价值。
题目描述
输入一个链表,输出该链表中倒数第k个结点。
题解一:栈
1 public static ListNode FindKthToTail(ListNode head,int k) { 2 if(head==null||k<=0){ 3 return null; 4 } 5 Stack<ListNode> stack = new Stack<>(); 6 while (head!=null){ 7 stack.push(head); 8 head=head.next; 9 } 10 if(k>stack.size()){ 11 return null; 12 } 13 while (!((--k) ==0)){ 14 stack.pop(); 15 } 16 ListNode backTh=stack.pop(); 17 return backTh; 18 }
1 //首先定义两个指向链表头的指针p ,q;先令p指向正数第k节点,然后两个指针同时向后移动, 2 //直到p为最后一个,q此时移动了总长度-k个节点,即q指向倒数第k个节点。当k为零或节点为空返回。 3 public static ListNode FindKthToTail01(ListNode head,int k) { 4 ListNode p, q; 5 p = q = head; 6 int i = 0; 7 for (; p != null; i++) { 8 if (i >= k) { 9 q = q.next; 10 } 11 p = p.next; 12 } 13 return i < k ? null : q; 14 }
初始化链表:
1 public static class ListNode{ 2 int val=0; 3 ListNode next=null; 4 public ListNode(int val){ 5 this.val=val; 6 } 7 } 8 public static ListNode createList(int[] list){ 9 ListNode head = new ListNode(-1); 10 ListNode current=head; 11 for(int i=0;i<list.length;i++){ 12 current.next=new ListNode(list[i]); 13 current=current.next; 14 } 15 return head.next; 16 }
测试:
1 public static void main(String[] args) { 2 int[] list={1,2,3,4,5,6}; 3 int k=4; 4 ListNode head= createList(list); 5 ListNode kth = FindKthToTail02(head, k); 6 System.out.println(kth.val); 7 } 8 输出: 3
以上是关于剑指Offer14链表中倒数第k个结点的主要内容,如果未能解决你的问题,请参考以下文章