暴力点的思路其实就是先遍历一次,知道整个链表的长度.然后再计数到倒数n个节点的前一个节点.让这个节点的next为下下个节点即可.(不考虑释放内存的事情)
我一开始想到的是还蠢一点的方法,就是每次遍历一个节点,都判断这个节点的n个节点后是不是null,是的话就找到了倒数的节点.
看了下题解,发现了更不错的解法.叫快慢指针法.即设置两个指针,一前一后,两个指针相隔n个节点,一起进行遍历.当后面那个指针遍历到尾节点时,前面那个指针指向的就是目标节点.
/**
* 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 res = new ListNode(0,head);
ListNode pn = res;
ListNode pp = res;
for(int i=0;i<n;i++)
pn = pn.next;
while(pn.next!=null){
pn = pn.next;
pp = pp.next;
}
pp.next = pp.next.next;
return res.next;
}
}
注意:
- 添加一个头结点.可以规避掉删除首元节点需要特殊讨论的问题
- 删除节点需要获取的是被删节点前一个节点的指针