1. 程式人生 > 其它 >連結串列 leetcode 19. 刪除連結串列的倒數第 N 個結點

連結串列 leetcode 19. 刪除連結串列的倒數第 N 個結點

技術標籤: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;
    }
}