这道题目其实和输出链表的倒数第n个结点是基本上一致的。https://blog.nowcoder.net/n/4e57664df6974486bc352aa5a1e4613c
和上一道题一样,定义快慢指针,快指针先走n步,然后快慢指针一起走,快指针走到空的时候慢指针正好在倒数第n个结点上。
区别的地方只是在于要删除某个结点的话,我们需要知道它的前一个结点是什么。
如果要删除的结点是链表头结点的话(这个时候没有前一个结点)。这种情况下我们进行一下特判就可以了。
c++
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { // write code here ListNode* fast = head; ListNode* slow = head; ListNode* pre = head; for(int i = 0 ; i < n ; i++) { fast = fast->next; } while(fast!=NULL) { fast = fast->next; pre = slow; slow = slow->next; } ListNode* target; if(slow!=head) { target = pre->next; pre->next = target->next; } else{ target = head; head = head->next; } delete target; return head; } };
java
import java.util.*; public class Solution { public ListNode removeNthFromEnd (ListNode head, int n) { ListNode fast = head; ListNode slow = head; ListNode pre = head; for(int i = 0 ; i < n ; i++){ fast = fast.next; } while(fast!=null){ fast = fast.next; pre = slow; slow = slow.next; } ListNode target; if(slow!=head){ target = pre.next; pre.next = target.next; } else{ target = head; head = head.next; } return head; } }
python
class Solution: def removeNthFromEnd(self , head , n ): fast = head slow = head pre = head for i in range(0,n): fast = fast.next while fast!=None: fast = fast.next pre = slow; slow = slow.next if slow!=head: target = pre.next pre.next = target.next else: target = head head = head.next return head