説明
ヘッドノードリストにリスト、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;
}
};