给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
算法分析:
(1)遍历单链表并计下单链表长度N,则被删除的节点位置为 (N-n),在第二趟遍历时移除这个节点;
(2)只使用一次扫描,需要额外增加一个指针遍历。两个指针 f 和 s,s 先前进 n 个单位,随后 f 和 s 一起前进,s 到达单链表末尾时 f 刚好位于要删除的节点。
代码如下:
ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* f = head; ListNode* s = head; for (int i = 0; i < n; i++) { s = s->next; }
//删除的节点是头节点 if (!s) { return head->next; }
//删除当前节点需要获取前一个节点,所以这里遍历完 f 位于要删除节点的前一节点 while (s->next) { f = f->next; s = s->next; }
//删除节点 f->next = f->next->next; return head; }