思路
双指针
让其中一个指针先走n步,然后两个指针再同时前进,当前面的指针走到头时,后面的指针指向的就是要删除的元素
注意对于头结点的应用(方便删除原先head节点)
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (null == head)
return null;
ListNode dummy = new ListNode(0, head);
ListNode right = head, left = dummy;
for (int i = 0; i < n - 1; i++) {
right = right.next;
}
while (null != right.next) {
right = right.next;
left = left.next;
}
left.next = left.next.next;
return dummy.next;
}
}
注意代码中left是从dummy出发的,这样当right.next是null时,left指向待删除结点的前一个结点
Go代码
func removeNthFromEnd(head *ListNode, n int) *ListNode {
pre := &ListNode{
Next: head,
}
fast, slow := pre, pre
for i := 0; i < n; i++ {
fast = fast.Next
}
for fast.Next != nil {
fast = fast.Next
slow = slow.Next
}
slow.Next = slow.Next.Next
return pre.Next
}