引言
由 “LSGO软件技术团队” 组织的 “基础算法刻意练习” 采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。以下是我的每日打卡记录:
Task11.删除链表的倒数第N个节点
-
Leecode第19题
-
难度:中等
-
题目概述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗?
题解思路
第一次遍历获得链表的长度 len,第二次遍历找到需要删除的节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode result=new ListNode(-1);
result.next=head;
ListNode cur=head;
int len=0;
while(cur!=null){
len++;
cur=cur.next;
}
cur=result;
for(int i=0;i<len-n;i++)
cur=cur.next;
cur.next=cur.next.next;
return result.next;
}
}
提交记录
利用两个间隔为 n 的指针,一起移动,当后一个指针到达末尾时,前一个指针正好是要删除的节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode previous=new ListNode(0);
previous.next=head;
ListNode current=head;
for(int i=1;current!=null;i++){
current=current.next;
if(i>n)
previous=previous.next;
}
if(previous.next==head)
head=head.next;
else
previous.next=previous.next.next;
return head;
}
}