JZ14---链表中倒数第k个结点

题目

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

思路

方法一:

  1. 遍历链表,取出链表的值,将他们存储到 list 集合中
  2. 通过 list 的长度和 k 值的关系。
    1. 得出倒数第k的结点的是正数的第几个结点。进行第三步。
    2. 得出倒数第k的结点到底存不存在。如:k <= 0 、k > 链表的长度
  3. 再一次遍历链表,循环第二次得到的那个数值即可。

AC代码

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.ArrayList;
public class Solution {
     
    public ListNode FindKthToTail(ListNode head,int k) {
     
        if(head == null)
            return null;
        ArrayList<Integer> list = new ArrayList<Integer>();
    	ListNode t = head;
    	while(t != null) {
     
    		list.add(t.val);
    		t = t.next;
    	}
    	// 1 2 3 4 5 6 7 8 9 10
    	// 10 - 3 == 7
        if(list.size() < k || k <= 0)
            return null;
    	int answer = list.size() - k;
    	while(head != null) {
     
    		if(answer-- == 0)
    			return head;
            head = head.next;
    	}
    	return null;
    }
}

方法二:

  1. 定义两个指针。p1、p2
  2. 先让其中一个走 k 步。
    这里需要简单判断一下。
    1. 如果走了k步。p2还是在原地。说明 k <= 0 。
    2. 如果还没有走满k步。p2已经指向了null。说明 k > 链表长度
  3. 开始两个一起走
    1. 如果p2等于了null。则p1指向的位置就是我们要的答案
    2. 上述条件能满足是因为,p1和p2间隔k个单位。

AC代码

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.ArrayList;
public class Solution {
     
    public ListNode FindKthToTail(ListNode head,int k) {
     
        if (head == null)
			return null;
		ListNode p1 = head, p2 = head;
		while (p2 != null && k > 0) {
     
			p2 = p2.next;
			k--;
		}

		// 简单判断两个条件
		if ((p2 == null && k > 0) || p2 == head) {
     
			return null;
		}

		while (p2 != null) {
     
			p1 = p1.next;
			p2 = p2.next;
		}
		return p1;
    }
}

你可能感兴趣的:(剑指Offer,链表,指针)