题目:
给你一个链表,删除链表的倒数第 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]
解题思路1:倒数n个节点如果把链表反转就是正数的第n个节点,那么只要反转链表然后遍历到n-1删除节点再反转链表就行。反转链表具体操作在我另一篇文章里有。反转链表
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode tem = reverse(head);
ListNode dummy = new ListNode(0);
dummy.next = tem;
ListNode cur = dummy;
for(int i = 0; i < n-1; i++){
cur = cur.next;
}
cur.next = cur.next.next;
ListNode result = reverse(dummy.next);
return result;
}
public ListNode reverse(ListNode head){
ListNode tail = null;
ListNode cur = head;
while(cur != null){
ListNode tem = cur.next;
cur.next = tail;
tail = cur;
cur = tem;
}
return tail;
}
但是这种解法有点野路子的感觉,所以这里还有一种解法用快慢指针,快慢指针开头都指向虚拟节点,快指针先遍历n次节点而后两个指针一起进行遍历,到最后快针与慢针的距离就是n,那么慢针下一个就是要删除的节点
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode fast = dummy;
ListNode slow = dummy;
for(int i = 0; i < n; i++){
fast = fast.next;
}
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dummy.next;
}