【备战春招】算法学习-第三天

113 阅读2分钟

今天做了两道题,长得很像,但思路完全不同。
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) (leetcode-cn.com)
链表中倒数最后k个结点_牛客题霸_牛客网 (nowcoder.com)

1.删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n **个结点,并且返回链表的头结点。

示例 1:

输入: head = [1,2,3,4,5], n = 2
输出: [1,2,3,5]

这道题我用回溯的思想做的,即先走到最后,再往前回溯,一直回溯到第K个。

 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    int i=0;
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head==null) return null;
        head.next= removeNthFromEnd(head.next,n);
        i++;
        if(n==i) return head.next;
        return head;
    }
}

2.链表中倒数最后k个结点

## 描述

输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。

如果该链表长度小于k,请返回一个长度为 0 的链表。

数据范围:0 \leq n \leq 10^50≤n≤1050 \leq a_i \leq 10^90≤ai​≤1090 \leq k \leq 10^90≤k≤109

要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:

输入:
{1,2,3,4,5},2
返回值:
{4,5}
说明:
返回倒数第2个节点4,系统会打印后面所有的节点来比较。 

创建一个弟弟,然后沿着哥哥走过的路走。

import java.util.*;

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

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pHead ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode FindKthToTail (ListNode pHead, int k) {
        //判错
        if(pHead==null) return null;
        //创建一个弟弟
        ListNode pHead1=new ListNode(pHead.val);
        pHead1.next=pHead.next;
        //哥哥走到最后
        int i=0;
        while(pHead!=null){
            pHead=pHead.next;
            i++;
        }
        //判错
        if(k>i) return null;
        //弟弟走到哥哥的前面第K个位置
        for(int j=0;j<i-k;j++){
            pHead1=pHead1.next;
        }
        //返回弟弟
        return pHead1;
    }
}