思路:
显然很适合dfs的后序。那么dfs代码如下:
稍微有个小坑就是删除头的时候,也就这一个特例吧。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null) return null;
int[] reverseDeep = new int[1];
if(dfs(reverseDeep,head,null,n)) {
return head.next;
}
return head;
}
/**
*
* @param reverseDeep 倒着记录层数,从触底开始为1
* @param head
* @param preNode 上个节点
* @param n
* @return true代表需要删除头
*/
boolean dfs(int[] reverseDeep,ListNode head,ListNode preNode, int n) {
if(head == null) {
reverseDeep[0] = 1;
return false;
}
dfs(reverseDeep, head.next,head,n);
// 后序开始啦
// 如果需要删除了
if(reverseDeep[0] == n) {
if(preNode != null) {
preNode.next = head.next;
}else {
// 进入这里代表是要删除头结点
// 好久没刷题,把这一茬忘记了。如果java可以这样该多么优雅啊
// head = head.next;
return true;
}
}
reverseDeep[0]++;
return false;
}
}