题目
给你一个链表,删除链表的倒数第 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]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
解题方法
1
我用的是暴力的笨方法,因为第一反应就是这么做。具体做法是先倒置链表,然后从头开始找要删除的元素,找到后删除,然后再倒置链表。倒置链表就是把链表用头插法加入到一个新链表。
这里要注意n=1的情况,这种情况下需要调整一下链表的头节点(这里指第一个节点)。
下面是java实现代码
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode reHead = reverseList(head);
ListNode p = new ListNode();
p.next = reHead;
for(int i=1; i<n; i++){
p = p.next;
}
p.next = p.next.next;
if(n == 1){
return reverseList(p.next);
}else{
return reverseList(reHead);
}
}
public ListNode reverseList(ListNode head){
ListNode q = new ListNode();
while(head != null){
ListNode k = new ListNode(head.val);
k.next = q.next;
q.next = k;
head = head.next;
}
return q.next;
}
}
2
第二种方法是看了代码随想录得做法,具体操作是用一对快慢指针,快指针比慢指针快n个,就是让快指针先走n次,然后两个指针一起走,当快指针走到最后得时候,慢指针指到的元素正好是倒数第n个。
有一说一,确实妙啊!
以下是java实现代码
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode headNode = new ListNode();
headNode.next = head;
ListNode fast = headNode;
ListNode slow = headNode;
for(int i=0; i<n; i++){
fast = fast.next;
}
while(fast.next != null){
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return headNode.next;
}
}