Java数据结构与算法之-------如何找出单链表的倒数第K个元素

1 问题

     找出单链表的倒数第K个元素,例如给定链表  1--2---3--4--5--6---7  ,则单链表的倒数第K=3个元素为5.

2 思路分析

    方法一: 顺序遍历两遍法

       1)首先遍历一遍链表,计算出链表中的节点数n.

       2)把倒数第k个数,转成正数第n-k个元素。

      3)遍历链表,找到第n-k个元素。

  方法二:快慢指针法

     1)因为单链表只能从头到尾遍历元素,因此可以定义两个快慢指针

     2)快指针比慢指针先移动K步,然后一起移动,

     3)快指针到链表尾部时,慢指针就正好指向倒数第K个元素

3 代码实现

package linkedlist.LookLnode;

public class LookLnode {

    public static void main(String[] args) {
        LNode head = ConstrucList();
        LNode result=null;
        System.out.print("链表:");
        Print(head);
        result=findLastLnode(head,3);
        if (result!=null){
            System.out.printf("\n链表的倒数三个元素为%d",result.date);
        }

    }
    //首先定义一个单链表
    public static LNode ConstrucList(){
        int i=0;
        LNode head=new LNode();
        head.next=null;
        LNode temp=null;
        LNode cur=head;
        //构建一个链表
        for (;i<8;i++){
            temp=new LNode();
            temp.date=i;
            temp.next=null;
            cur.next=temp;
            cur=temp;
        }
        return head;
    }

    //打印单链表的数据
    public static void Print(LNode head){
        for (LNode cur=head.next;cur!=null;cur=cur.next){
            System.out.print(cur.date+" ");
        }
    }

    /**
     *   找出链表的倒数第K个节点
     * @param head   头结点
     * @return    倒数第K个节点
     */
    public static LNode findLastLnode(LNode head,int k){
        if (head==null|| head.next==null){
            return head;
        }
        LNode fast=null;//快指针
        LNode slow=null;//慢指针
        fast=slow=head.next;
        int i=0;
        for (;i<k && fast!=null;++i){//前移K步
            fast=fast.next;
        }
        //判断k是否大于链表的长度
        if (i<k){
            return null;
        }
        while (fast!=null){
            slow=slow.next;
            fast=fast.next;
        }
        return slow;
    }

}
class LNode{
    LNode next;
    int date;
}

 

    

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值