【中等】19-删除链表的倒数第N个节点

题目

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

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

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.

说明:

给定的 n 保证是有效的。

Follow up:

Could you do this in one pass?

进阶:

你能尝试使用一趟扫描实现吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list

解法

方法一:双指针

解题思路

定义两个指针,让前方指针先走一段距离,使得前后指针在链表上的距离为n,当前方指针到达末尾处时,后方指针的下一个位置就是要删除的位置,如果这个位置是头节点,就返回头节点的下一个节点,否则,就把后方指针的下一位定义成要删除的下一位。

代码

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *front = new ListNode(0);
        front->next = head;
        ListNode *back = front;
        for(int i = 0; i < n+1; ++i){
            front = front->next;
        }
        while(front != NULL){
            front = front->next;
            back = back->next;
        }
        if(back->next == head) return head->next;
        back->next = back->next->next;
        return head;
    }
};

方法二:两次遍历

解题思路

先遍历一边记录链表大小,然后再次遍历找到要删除的位置删除即可。

代码

posted @ 2020-04-23 19:51  陌良  阅读(113)  评论(0编辑  收藏  举报