开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情
题目、19. 删除链表的倒数第 N 个结点
原题链接:19. 删除链表的倒数第 N 个结点
题目描述:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
/
示例 2:
输入:head = [1], n = 1
输出:[]
/
示例 3:
输入:head = [1,2], n = 1
输出:[1]
解题思路:
题目要求我们删除指定的倒数第n个节点,并且返回链表的头节点。
为了得到倒数第n个节点的位置,我们需要遍历整个链表,记录节点的数量,但是我们知道,链表是单向的,当我们遍历完整个链表,就没有办法再回到遍历过节点前的位置了。
为了解决这个问题,我们就需要额外创建新的链表,将其指向头节点,这么一来,当我们遍历完链表,就可以通过另外一个头节点操作链表,删除倒数第n个位置的节点。
当我们对链表完成删除操作,就相当于再一次遍历了链表,又找不回头节点了,所以还要提前建立一个链表,将头节点指向head,方便我们删除完节点后还能返回头节点。
总的来说,我们新创建了两个额外的头节点,方便返回头节点位置。
这么一来,我们就成功通过两次遍历完成需求,第一次遍历获取链表长度,第二次遍历完成了节点的删除...
提交代码:
/**
* 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 {
public ListNode removeNthFromEnd(ListNode head, int n) {
int len = 0; //用于记录链表长度
ListNode temp = head; //指向链表第一个元素
ListNode curr = new ListNode(0,head); //创建一个待头节点的链表,头节点指向链表的第一个元素
while(temp != null){ //遍历链表
temp = temp.next; //从第一个元素开始遍历
len++; //记录节点个数
}
temp = curr; //使用带头结点的链表遍历
for(int i = 1;i < len-n+1 ;++i){ //从头节点0的下一个元素开始,遍历到倒数第n个数的前一个节点
temp = temp.next;
}
temp.next = temp.next.next; //删除倒数第n个节点
return curr.next; //返回链表中第一个节点坐标
}
}
提交结果: