本次总结的问题是删除链表中的倒数节点,我们知道链表查找的时间复杂度是O(n)所以想要像数组那样实现常数时间内倒数第n个删除节点是比较困难的,这里需要借助双指针法来进行操作
删除倒数第N个节点(题号19)
例19题目:
1.双指针
设两个指针fast和slow,控制fast在slow后方,这样就可以实现链表不同位置的同时操作。针对本题,我们可以先让fast走n步,之后让slow和fast同时走,这样当fast走到链表末尾的时候slow便是倒数第n个节点(实际上让fast先走n+1步,因为这样slow指向倒数第n个节点的前一个节点便于删除)
2.代码说明
/**
* 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) {
ListNode fhead = new ListNode(0);
//虚拟头结点的创建
fhead.next=head;
ListNode p=fhead;
ListNode pre=fhead;
//创建双指针p和pre
while(n-->=0){
p=p.next;
}
//控制p走n-1步
while(p!=null){
pre=pre.next;
p=p.next;
}
//p和pre一起走保证n的间隔
pre.next=pre.next.next;
//删除倒数第n个节点
return fhead.next;
}
}