【剑指offer】刷题记录-链表中倒数第k个结点

题目描述

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

思路:倒数第k个结点就是正数第n-k+1个结点,其中n是链表的长度。这里我们就需要先遍历链表得到它的长度。然后第二次遍历找到第n-k+1个就是倒数第k个结点。

// 链表中倒数第k个结点
public class Solution {
	class ListNode {
		int val;
		ListNode next = null;

		ListNode(int x) {
			val = x;
		}
	}

	public ListNode FindKthToTail(ListNode head, int k) {
		if (head == null || k <= 0) {
			return null;
		}
		// 得到链表长度
		int count = 0;
		ListNode node = head;
		while (node != null) {
			count++;
			node = node.next;
		}
		if (count < k) {
			return null;
		}
		ListNode pNode = head;
		for (int i = 0; i < count - k; i++) {
			pNode = pNode.next;
		}
		return pNode;
	}
}

思路2:可以定义两个指针,一个快指针,一个慢指针。快指针先向前走k-1步,慢指针不动,从第k步开始,两个指针一起走。当快指针走到尾结点时,慢指针恰好走到倒数第k个。

                               

public class Solution {
	class ListNode {
		int val;
		ListNode next = null;

		ListNode(int x) {
			val = x;
		}
	}

	public ListNode FindKthToTail(ListNode head, int k) {
		if (head == null || k <= 0) {
			return null;
		}
		// 定义两个指针
		ListNode p1 = head;
		ListNode p2 = head;
		// 第一个指针向前走k-1步
		for (int i = 0; i < k - 1; i++) {
			p1 = p1.next;
		}
		if (p1 == null) {
			return null;
		}
		while (p1.next != null) {
			p1 = p1.next;
			p2 = p2.next;
		}
		return p2;
	}
}

猜你喜欢

转载自blog.csdn.net/Littlecome/article/details/82079803