19. Remove Nth Node From End of List

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhougb3/article/details/79979656

题目描述

Given a linked list, remove the n-th node from the end of list and return its head.

Example:

Given linked list: 1->2->3->4->5, and n = 2.

After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:

Given n will always be valid.

Follow up:

Could you do this in one pass?

解题代码

 class Solution {
 public:
     ListNode* removeNthFromEnd(ListNode* head, int n) {
         if (head == nullptr || head->next == nullptr)
             return nullptr;
         int step = 1;
         ListNode * first = head, *second = head, *parent = head;
         while (step++ < n)
         {
             first = first->next;
         }
         if (first->next == nullptr) {
             head = head->next;
             delete[] second;
             return head;
         }
         while (first->next != nullptr)
         {
             first = first->next;
             parent = second;
             second = second->next;
         }
         parent->next = second->next;
         delete[] second;
         return head;
     }
 };

解题思路

  1. 最常见的方法是遍历两遍链表,第一遍得到链表的节点数目,第二遍是找到指定位置的链表。
  2. 可以做到只遍历一遍链表,但需要两个指针。因为要删除的是倒数第n个节点,那我们让两个指针指向的节点相差n个,那么当前面的指针指向链表尾节点时,后面的指针指向的节点就是我们想要删除的节点。
  3. 由于我们要删除节点时,需要拿到的节点是待删除节点的父节点。初始化时我们让父亲节点指针和删除节点指针指向头节点。先判断两个指针相差n时前面的指针是不是已经指向尾节点了,是的话删除的就是头节点。否则就循环至尾节点,使用父节点指针删除待删除节点。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页