今天做了两道题,长得很像,但思路完全不同。
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≤105,0 \leq a_i \leq 10^90≤ai≤109,0 \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;
}
}