leetcode 19 刪除鍊錶的倒數第N個節點

2021-09-25 04:36:45 字數 1881 閱讀 3629

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。

示例:給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.

這個題有遍歷一遍的解法,也有遍歷兩次的解法。

首先,用c++實現遍歷兩次的:

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

listnode *temp = head;//宣告乙個新指標,並將其賦值為頭指標;

int len = 0;

while(temp)

if(len==1);

}else if(len-n==0)

int i=0;

temp = head;//這是重新指標指向頭結點;

//temp = temp->next;

while(inext;

//head = head ->next;

i++;

}temp->next = temp->next->next;//將目標的節點刪除;

return head;

}};

第二種解法是只是遍歷一次,設定雙指標,兩個指標的間隔是n+1,這樣,第乙個節點到最後的時候,第二個節點正好到目標節點的前乙個節點;

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

listnode *temp = head;//宣告乙個新指標,並將其賦值為頭指標;

listnode *temp2 = head;//宣告第二個指標,並將其賦值為頭指標;

int i = 0;

while(inext;

i++;

}if(temp==nullptr)

while(temp->next)

temp2->next = temp2->next->next;//這裡是刪除目標節點;

return head;

}};

然後我們這裡再提供乙個python3的解法,雙指標吧,***,python的速度,嗯。。。。。

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class solution:

def removenthfromend(self, head: listnode, n: int) -> listnode:

if head.next == none:#這裡是排除鍊錶中只有1個元素;

return none

a = listnode(0)

a.next=head

p,q = a,a # 這裡是宣告兩個指標

for _ in range(n):

p=p.next

if p.next==none:# 這裡是將鍊錶長度與n相等的情況,只需要將第乙個元素排除掉;還有乙個重要的點,是python裡面怎樣判斷鍊錶的節點是空的;

return head.next

while p.next:

p=p.next

q=q.next

q.next = q.next.next

return head

LeetCode 19 鍊錶(160)

1 如圖,鍊錶是一種非常常用的資料結構 煉表頭 指向第乙個鍊錶結點的指標 鍊錶結點 鍊錶中的每乙個元素,包括 1 當前結點的資料,2 下乙個結點的位址 鍊錶尾 不再指向其他結點的結點,其位址部分放乙個null,表示鍊錶到此結束。2 鍊錶可以動態地建立 動態地申請記憶體空間 int pint new ...

鍊錶 LeetCode19刪除鍊錶中的第N個節點

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?分析 看到這個問題,第一反應,先求長度,再找節點,看一下高階,有...

Leetcode 19 刪除鍊錶的第N個節點

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?兩次遍歷的演算法思路 第一遍歷從頭結點開始來計算鍊錶的長度,然後...