連結串列 leetcode 19. 刪除連結串列的倒數第 N 個結點
阿新 • • 發佈:2021-02-12
技術標籤:leetcode
題目內容
給你一個連結串列,刪除連結串列的倒數第 n 個結點,並且返回連結串列的頭結點。
進階:你能嘗試使用一趟掃描實現嗎?
示例 1:
輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]
示例 2:
輸入:head = [1], n = 1
輸出:[]
示例 3:
輸入:head = [1,2], n = 1
輸出:[1]
提示:
連結串列中結點的數目為 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
c語言解答
/**
*思路 雙指標,以個指標先走k步 然後倆指標開始同時走,最後那個走的指標就是要刪除指標的前一個
*
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
//如果給的head下一個就是空的話,那刪除的肯定是當前結點,直接返回空就行
if(head-> next==NULL){
return NULL;
}
//記錄遍歷的指標zou
struct ListNode*zou=head;
//記錄倒數第n個節點前那個節點的指標p
struct ListNode*p=head;
//計數
int count=0;
while(zou!=NULL){
//光zou指標走的時候
if(count<=n){
count++;
}
//兩指標開始同步走
else{
//count++;
p=p->next;
}
zou=zou->next;
}
// if(p->next==NULL){
// return head; 這個不用考慮,因為前面開頭已經考慮過了,只要zou指標能往下走後,p->next一定不會空
// }
//考慮刪除的結點是頭結點,namenamewhile迴圈中 else 是沒有執行到
if(count==n){
return head->next;
}
//正常情況下,刪除倒數第n個節點,通過讓前一個指標指向他的後一個指標來實現
p->next=p->next->next;
return head;
}
java解答
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//如果給的head下一個就是空的話,那刪除的肯定是當前結點,直接返回空就行
if(head.next==null){
return null;
}
//記錄遍歷的指標zou
ListNode zou=head;
//記錄倒數第n個節點前那個節點的指標p
ListNode p=head;
//計數
int count=0;
while(zou!=null){
//光zou指標走的時候
if(count<=n){
count++;
}
//兩指標開始同步走
else{
// count++;
p=p.next;
}
zou=zou.next;
}
//考慮刪除的結點是頭結點,namenamewhile迴圈中 else 是沒有執行到
if(count==n){
return head.next;
}
//正常情況下,刪除倒數第n個節點,通過讓前一個指標指向他的後一個指標來實現
p.next=p.next.next;
return head;
}
}