题目:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
简单介绍:
题目:删除链表的倒数第N个节点
题目难度:中等
使用语言:JAVA
这道题来自leetcode题库的双指针、链表标签。
解题思路:
首先看题、分析题意,我们可以明确1个关键点:
1.如何实现一趟遍历完成删除过程
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题
数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用:
1.采用新链表的方式来保存修改后的链表
算法:
既然明确了我们的数据结构,我们就可以开始我们的算法分析了。
1.第一步,初始化工作(设置双指针、结果链表)。
2.第二步,移动第一个指针,移动n+1个距离。
3.第三步,同时移动第一、二个指针,直到第一个指针指向null。
图解:
代码部分:
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode temp=new ListNode(0);
temp.next=head;//防止后面的(second.next=second.next.next;)越界
ListNode first=temp;
ListNode second=temp;
for(int i=0;i<n+1;i++){//n+1是为了删让second指针指向要移除元素的上一个元素
first=first.next;
}
while(first!=null){
first=first.next;
second=second.next;
}
second.next=second.next.next;
return temp.next;//新链表
}
}
结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!