Day14:链表中倒数第k个结点

时间:2022-07-24
本文章向大家介绍Day14:链表中倒数第k个结点,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指Offer_编程题——链表中倒数第k个结点

题目描述:

输入一个链表,输出该链表的倒数第k个结点。

具体要求:

时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M

具体思路:

思路一:   我们需要遍历出链表的长度,然后遍历出我们需要的倒数第k个结点,这是我们常规的想法,当然也考虑了代码的鲁棒性和空指针,k为0,k应该大于链表的长度。 1、首先我们用Java实现该思路:

public class Solution{
	public ListNode FindKthToTail(ListNode head, int k){
		if(head == null || k <= 0)
			return null;
		ListNode p = head;
		int n = 0;
		while(p != null){
			n++;
			p = p.next;
		}
		ListNode q = head;
		for(int i = 0; i <n - k; i++){
			q = q.next;
		}
			if(n < k)
				return null;
			else
				return q;
	}	
}

代码效果图如图所示:

  如果在牛客网中,此时代码即可编译通过,因为该编译器已经定义了结点,定义的形式如下图所示:

  但是,我们如果在本地编译器(eclipse和IDEA)的时候,就得将该节点的定义写上,否则无法通过编译,具体实现如下:

public class ListNode{
	int val;
	ListNode next = null;
	ListNode(int val){
		this.val = val;
	}
}

2、用python将其思路实现:

class Solution:
	def FindKthToTail(self, head, k):
		if(head == None or k == 0):
			return None
		nodeFir = head
		nodeSco = head
		for i in range(1, k):
			if(nodeFir.next != None):
				nodeFir = nodeFir.next
			else:
				return None
		while(nodeFir.next != None):
			nodeFir = nodeFir.next
			nodeSco = nodeSco.next
		return nodeSco

代码效果图如图所示:

思路二:   利用栈来解决这个问题,先压入栈 ,在取出k个值便是倒数取k个值,具体用python实现如下:

class Solution:
	def FindKthToTail(self, head, k):
		if(head == None or k == 0):
			return None
		count = 0
		stack = []
		while(head != None):
			stack.append(head)
			head = head.next
			count += 1
		if(count < k):
			return None
		for i in range(0, k):
			kNode = stack.pop()
		return kNode

代码效果图如图所示:

思路三:   我们接下来探讨一种崭新的思路,首先设置两个指针,将他们之间的长度设置为k,这里需要我们注意的是,我们定义的这两个指针是两把尺子,当尺子的末指针指向链表的末尾时,它的首指针就指向第k个结点。因此在实现的过程中,我们重点是当i>=k时,尺子的首指针在进行移动。具体代码的实现如下:

public class Solution{
	public ListNode FindKthToTail(ListNode head, int k){
	   if(head == null || k == 0)
	   		return null;
	   	ListNode p;
	   	ListNode q;
	   	p = head;
	   	q = p;
	   	int i = 0;
	   	for(; p != null; i++){
	   		if(i >= k)
	   			q = q.next;
	   		p = p.next;
	   	}
	   	if (i < k)
	   		return null;
	   	else
	   		return q;
	}
}

代码效果图如图所示:

总结

  本道题主要通过输入链表考察链表的输出结点,最基本的方法就是遍历出链表的长度,然后遍历出你所需要的倒数第K个节点。更进一层的方法就是利用栈来进行处理,最高级的也是最难想到的就是设置两个指针来进行解决,最难的就是循环时当i>=k时,指针进行移动。我们要借鉴别人的一些好的idea,拓宽自己的思路。总之,继续加油,争取早日找到工作,Good Luck!!!

参考文献

  本文的代码主要参考以下文章: [1] destiny_python [2] 女朋友说