前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode: Remove Nth Node From End of List

Leetcode: Remove Nth Node From End of List

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-01-22 16:02:48
3130
发布2019-01-22 16:02:48
举报

题目: Given a linked list, remove the nth node from the end of list and return its head.

For 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. Try to do this in one pass.

思路分析: 双指针,前后两个指针之间的距离为n-1,当后一个指针指向链表末尾结点的时候,前一个指针指向的结点就是要删除的结点。

C++参考代码:

代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution
{
public:
    ListNode *removeNthFromEnd(ListNode *head, int n)
    {
        if (!head) return nullptr;
        int count = 1;
        ListNode *previous = nullptr;//指向front元素前面的结点
        ListNode *front = head;//前面的指针,指向要删除的结点
        ListNode *back = head;//与front指针保持n-1的距离
        //将back指针从第1个位置移动到第n个位置
        while (count < n)
        {
            back = back->next;
            count++;
        }
        //将back指针一直移动到;链表最末尾
        while (back->next)
        {
            previous = front;
            front = front->next;
            back = back->next;
        }
        //如果previous不为空,则将previous指针的next指向front的next,即将front删除
        if (previous)
        {
            previous->next = front->next;
        }
        //如果previous为空,说明删除的是第一个位置的结点即头结点
        else
        {
            head = head->next;
        }
        front = nullptr;
        return head;

    }
};

C#参考代码:

代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int x) { val = x; }
 * }
 */
public class Solution
{
    public ListNode RemoveNthFromEnd(ListNode head, int n)
    {
        if (head == null) return null;
        ListNode previous = null;
        ListNode front = head;
        ListNode back = head;
        for (int i = 0; i < n - 1; i++)
        {
            back = back.next;
        }
        while (back.next != null)
        {
            previous = front;
            front = front.next;
            back = back.next;
        }
        if (previous != null)
        {
            previous.next = front.next;
        }
        else
        {
            head = head.next;
        }
        front = null;
        return head;
    }
}

Python参考代码:

代码语言:javascript
复制
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    # @return a ListNode
    def removeNthFromEnd(self, head, n):
        if not head:
            return None
        previous = None
        front = head
        back = head
        count = 1
        while count < n:
            back = back.next
            count += 1
        while back.next:
            previous = front
            front = front.next
            back = back.next
        if previous:
            previous.next = front.next
        else:
            head = head.next
        del front
        return head
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年03月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档