链表中倒数第k个结点

来源:互联网 发布:中国移动 健康大数据 编辑:程序博客网 时间:2024/06/16 02:53
链接:https://www.nowcoder.com/questionTerminal/529d3ae5a407492994ad2a246518148a
来源:牛客网
  • 热度指数:255270 时间限制:1秒空间限制:32768K
输入一个链表,输出该链表中倒数第k个结点。
分析:当链表为空或k<1时,直接返回null。从头到尾循环链表,每移动一次,k值减1。定义两个指针,指针cur用于循环链表,指针ans返回倒数第k个结点。链表循环结束后根据k值进行分析:
(1)当k==0时,链表元素的个数等于k,倒数第k个结点即为链表的第一个元素;
(2)当k<0时,链表元素的个数大于k,该情况下链表循环结束后k为负值。从头开始遍历链表,直至k = 0,此时指针ans.next即为所求;
(3)当k>0时,链表元素的个数小于k,此时不存在链表的第k个结点,直接返回null。

/*public class ListNode {    int val;    ListNode next = null;    ListNode(int val) {        this.val = val;    }}*/public class Solution {    public ListNode FindKthToTail(ListNode head,int k) {        if(head == null || k < 1)            return null;        ListNode cur = head;        ListNode ans = head;                 while(cur != null){        k--;        cur = cur.next;        }        if(k == 0)        return ans;        else if(k < 0){        while(++k != 0){        ans = ans.next;        }        return ans.next;        }        return null;                 }}

还有一种思路是参考讨论中菩提旭光的回答:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指针走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。

public class Solution{public static ListNode FindKthToTail(ListNode head,int k) {if(head == null || k < 1)            return null;        ListNode cur = head;        ListNode ans = head;                 for(int i = 0;i < k;i++){if(cur != null)                cur = cur.next;            else                return null;        }        while(cur != null){            cur = cur.next;            ans = ans.next;        }        return ans;}}




原创粉丝点击