您的位置:首页 > 编程语言 > Java开发

求链表中倒数第k个结点-Java实现

2017-02-14 10:51 316 查看
/*
需求:求链表中倒数第k个结点
思路:需要有两个指针,第一个指针先走k-1步,然后两个指针一起走
当第一个指针走到链表结尾时,第二个指针到达倒数第k个结点

解法:
1,Java如何定义链表?
链表是一个类,属性包括头结点和结点总数(此处必须考虑这个属性,因为需要跟k比较)
每个结点又是一个类,属性包括数据域和指向下一个结点的引用
2,创建一个链表
3,求倒数第k个结点
*/

//结点类
class Nod
{
public int data;//定义结点数据域
public Nod next=null;//定义指向下一个结点的引用

public Nod(int data)
{
this.data=data;
}
}

//链表类
class LinkList
{
public Nod head=null;//初始化链表头结点为空
private int nodeCount;//定义链表结点总数

//增加结点
public void addNod(int d)
{
Nod newNode=new Nod(d);

//若头结点为空,则让新增加的结点作为头结点
if (head==null)
{
head=newNode;
nodeCount++;
return;
}

//头结点不为空时,找到链表最后一个结点,在其后增加新节点
Nod temp=head;
while (temp.next!=null)
{
temp=temp.next;
}
temp.next=newNode;
nodeCount++;
}

//获取链表结点总数
public int getCount()
{
return nodeCount;
}
}

class  FindKthToTail
{
public static Nod findKthToTail(int k)
{
if (k==0)
{
System.out.println("k不能为0!");
return null;
}

//创建链表
LinkList ll=new LinkList();
ll.addNod(1);
ll.addNod(2);
ll.addNod(3);
ll.addNod(4);
ll.addNod(5);
ll.addNod(6);

int count=ll.getCount();

//判断链表是否为空
if (count==0)
{
System.out.println("链表为空!");
return null;
}

//判断链表结点总数和k的关系
if (k>count)
{
System.out.println("k大于链表结点总数!");
return null;
}

//第一个引用先走k-1步
Nod p1=ll.head;
for (int i=0;i<k-1 ;i++ )
{
p1=p1.next;
}

//两个引用一起走,知道第一个引用走到链表末尾
Nod p2=ll.head;
while (p1.next!=null)
{
p1=p1.next;
p2=p2.next;
}

return p2;
}

public static void main(String[] args)
{
Nod k=findKthToTail(0);
System.out.println("data:"+k.data);
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息