链表倒数第K个结点

链表倒数第K个结点

/*	剑指offer22;链表中第倒数第k个结点
 * 	题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,
 * 			  即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,
 * 			  它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
 * 	解题思路:1.倒数第k个结点的正序为:leng-k+1,先遍历链表求链表长度,再遍历链表取第length-k+1个结点
 * 			 2.维持两个指针p q,初始状态指向头结点,p向后移动,当p移动k位时q开始向后移动
 * 			      当p移动到尾结点时返回q结点。
 * 	输入检测:对于第一种思路;链表不能为空,k必须小于等于链表长度且k必须大于等于0
 * 		          对于第二种思路:链表不能为空,且必须大于0,k若大于链表长度则返回头结点
 * */
public class LianBiaoZhongDaoShuDiKGeJieDian {
	public static void main(String[] args) {
		LianBiaoZhongDaoShuDiKGeJieDian_Solution_2 solution_2 = new LianBiaoZhongDaoShuDiKGeJieDian_Solution_2();
		ListNode head = new ListNode(1);
		ListNode p1 = new ListNode(2);
		ListNode p2 = new ListNode(3);
		ListNode p3 = new ListNode(4);
		head.next=p1;
		p1.next=p2;
		p2.next=p3;
		p3.next=null;
		System.out.println(solution_2.getKthFromEnd(head, 5).val);
	}
}

class LianBiaoZhongDaoShuDiKGeJieDian_Solution_1 {
    public  ListNode getKthFromEnd(ListNode head, int k) {
    	if(head==null||k<=0) return head;
    	ListNode p = head;
    	int listLength = 0;
    	int index = 1;
    	//获取链表长度
    	while(p!=null) {
    		p=p.next;
    		listLength++;
    	}
    	if(k>listLength) {
    		System.out.println("aaaaaa");
    		return null;
    	}
    	//游标复位
    	p=head;
    	while(index!=(listLength-k+1)) {
    		p=p.next;
    		index++;
    	}
    	return p;
    }
}

class LianBiaoZhongDaoShuDiKGeJieDian_Solution_2{
	public  ListNode getKthFromEnd(ListNode head, int k) {
		if(head==null||k<=0) return null;
		ListNode p=head;
		ListNode q=head;
		int index = 1;
		while(p.next!=null) {
			p=p.next;
			if(index!=k)index++;
			else q=q.next;
		}
		return q;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值