链表中倒数第 K 个结点-反转链表

这是一个比较典型的题,很多地方书籍都有出现。

第一个想到的方法也是最容易的方法当然是先遍历链表得到链表的长度为 length ,

那么倒数第 K 个元素 第 length - K写一个for 循环,即可找到 目标结点。但是这样

需要先遍历一次链表,再遍历到倒数第 K 个结点,比较慢。

比较好的方法是我们设置两个结点,一个firsNode结点从头结点开始先向前走 K-1个

结点,一个secNode结点等firstNode结点向前走了 K -1个结点后再开始向前走。当firstNode

结点到达链表的尾部时secNode则刚好到达倒数第 K 个结点。



public ListNode FindKthToTail(ListNode head,int k) {
        if(head==null)
			return null;
		else{
			ListNode p=head;
			ListNode q=head;
			while(k>0&&p!=null){
				p=p.next;
				k--;
			}
			if(k>0&&p==null)
				return null;
			else{
				while(p!=null){
					p=p.next;
					q=q.next;
				}
				return q;
			}
		}
    }

链表的反转

	//反转链表
	public void reverseList(Node head){
		Node preverseHead=head;
		Node pNode=head;
		Node pPre=null;
		while(pNode!=null){
			Node pNext=pNode.next;
			if(pNext==null)
				preverseHead=pNode;
			pNode.next=pPre;
			pPre=pNode;
			pNode=pNext;
		}
		this.head=preverseHead;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值