Leetcode: Remove Nth Node From End of List

来源:互联网 发布:.net求数组中元素相加 编辑:程序博客网 时间:2024/05/01 17:38

题目:
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++参考代码:

/** * 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#参考代码:

/** * 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参考代码:

# Definition for singly-linked list.# class ListNode:#     def __init__(self, x):#         self.val = x#         self.next = Noneclass 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
0 0
原创粉丝点击