最後から二番目のノードNのリストの削除リストの終了]から、19取り外しN番目のノード

説明

ヘッドノードリストにリスト、n個のノードの削除リストの逆数とリターンを考えます。


ここに画像を挿入説明
のアイデアは、あなたがノードを削除すると、そこには、最初のノードをしなければなりません

  • CURノードは、ノードを削除する前に削除ノードはまずcur.next = cur.next.next、見つけなければなりません。最初のノードを削除する問題を解決するために、最初のノードは、リストを与えるために添加することができます。
  • 二回私自身のリストトラバーサル

計算チェーンが複数のノードを有し、リストを横断する、最初のリスト・ノード構造を与え、その後、再度リスト、第NUMのnノードをトラバース、cur.next = cur.next.next。[n番目のノードの前のカウントダウンは、ノードNUM-Nの正の数です]

  • ベターリンクリストを横断します
    ここに画像を挿入説明
  • 手順(1 + n)のポインタが低速ポインタよりも行き、ポインタの速度を提供し、最初のリストノード構造を与え、速いnullポインタノードポインタを歩くとき以上最後から二番目(N + 1)番目に来ますノード
    の答え
  • パイソン
*我自己的*
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        cur=head
        num=0
        while cur:
            cur=cur.next
            num+=1
        
        if num-n==0: return head.next
        count=1
        cur=head
        while count!=num-n:
            cur=cur.next
            count+=1
        cur.next = cur.next.next
        return head
*优化*
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        newHead=ListNode(0)
        newHead.next = head
        slow=newHead
        fast=newHead
        for i in range(n+1):
            fast=fast.next
        
        while fast:
            fast=fast.next
            slow=slow.next
        slow.next = slow.next.next
        
        return newHead.next
  • C ++
*我自己*
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* newHead = new ListNode(0);
        newHead->next = head;
        ListNode* cur=newHead;
        int num=0;
        while (cur)
        {
            num+=1;
            cur = cur->next;
        }
        
        int count = 1;
        cur=newHead;
        while (count!=num-n)
        {
            count+=1;
            cur=cur->next;
        }
        cur->next = cur->next->next;
        return newHead->next;
        
    }
};
*优化*
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* newHead = new ListNode(0);
        newHead->next = head;
        ListNode *slow=newHead,*fast=newHead;
        
        for (int i=0; i<n+1; i++)
            fast = fast->next;
        
        while (fast)
        {
            fast=fast->next;
            slow=slow->next;
        }
        slow->next = slow->next->next;
        return newHead->next;
        
    }
};
公開された78元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/puspos/article/details/103076804