1. 程式人生 > >刪除單鏈表的倒數第K個節點

刪除單鏈表的倒數第K個節點

/**
 * Created by lxw, [email protected] on 2017/10/27.
 * 刪除單鏈表中倒數第K個結點
 */
public class TheLastKthNode {
    public class Node{
        public int value;
        public Node next;
        
        public Node(int data){
            this.value = data;
        }
    }
    
    public Node removeLastKthNode(Node head, int lastKth){
        if(head == null || lastKth < 1)
            return head;
        Node cur = head;
        while (cur != null){
            lastKth--;
            cur = cur.next
        }
        if(lastKth ==0){
            head = head.next;
        }
        if(lastKth < 0){
            cur = head;
            while (++lastKth != 0){
                cur = cur.next;
            }
            cur.next = cur.next.next;
        }
        return head;
    }
}

ps: 假設N=9, K=6,目的是刪除倒數第6 個元素,也就是正數第4個元素,需要找到目標元素的前一個元素。讓連結串列從頭開始走,每移動一步,K減1,如第三行所示,最後一個元素為-3(K-N),然後進行第二次遍歷,K的值依次加1,當為0時停止遍歷,此時所對應的結點即為要刪除元素的前一個結點

正數 1 2 3 4 5 6 7 8 9
倒數 9 8 7 6 5 4 3 2 1
5 4 3 2 1 0 -1 -2 -3
-2 -1 0
1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1

另外一種方法是使用雙指標,front, back,front先走K個結點, 然後back與之同步走, 當front.next == null時, back所對應的結點就是要刪除結點的前一個結點

相關推薦

倒數k節點

stream malloc end alloc sizeof size clu AC list 題目:輸入一個鏈表,輸出該鏈表中倒數第k個結點 思路:1.遍歷兩遍鏈表,第一遍找到鏈表長度n,第二遍從0到n-k+1找到倒數第k個節點,不是最優解。    2.使用兩個指針,只需

返回單鏈k節點(leet簡單篇八百七十六題)

給定一個帶有頭結點 head 的非空單鏈表,返回連結串列的中間結點。 如果有兩個中間結點,則返回第二個中間結點。 示例 1: 輸入:[1,2,3,4,5] 輸出:此列表中的結點 3 (序列化形式:[3,4,5]) 返回的結點值為 3 。 (測評系統對該結點序列化表述

LeetCode 19. Remove Nth Node From End of List(刪除單鏈倒數N結點)

題目描述:    Given a linked list, remove the nth node from the end of list and return its head.例子: Give

單鏈倒數k元素

1.演算法要求 已知一個帶有表頭結點的單鏈表,結點結構為 typedef struct lnode { elemtype data; struct lnode *next; }lnode, *linklist;假設該連結串列只給出了頭指標l.在不改變連結串列的前提

查詢單鏈倒數k元素

查詢單鏈表倒數第m個結點,要求時間複雜度為O(n).(提示,使用雙指標) 解題思路: 常規思路為先獲取連結串列的長度N,然後返回N-k+1位置處的結點即可。但是中需要遍歷兩次連結串列。 我們使用另一種演算法,設定兩個指標p1,p2.將這兩個指標

LintCode 找到單鏈倒數n節點

給出連結串列 3->2->1->5->null和n = 2,返回倒數第二個節點的值1. 第一種方法:單鏈表只有頭指標,所以只能從頭部開始尋找,先遍歷一遍連結串列,確定連結串

輸出單鏈倒數K結點值

倒數 else stdio.h cout size ++ iostream 鏈表 create #include<iostream>using namespace std;#include<malloc.h>#include<stdio.h&g

Java 找打單鏈倒數k元素

單鏈表 auth sys int nod turn ++ util ear package List.www.cn; import java.util.ArrayList; /** * 在單鏈表中找打倒數第k個元素 * @author Administrator * *

刪除倒數n節點

val lin nod clas next pre def end list 題目: 給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。 示例: 給定一個鏈表: 1->2->3->4->5, 和 n = 2. 當刪除了倒數

2.2 在單鏈和雙鏈刪除倒數K節點

刪除 函數 del 另一個 核心 鏈表 刪除倒數第k個 單鏈表 dex 題目:分別實現兩個函數,一個可以刪除單鏈表中倒數第K個節點,另一個可以刪除雙鏈表中倒數第K個節點 要求:如果鏈表長度為N,時間復雜度達到O(N),額外空間復雜度達到O(1) My: 刪除單鏈表或雙鏈表中

單鏈和雙鏈刪除倒數K節點

題目 分別實現兩個函式,一個可以刪除單鏈表中倒數第K個節點,另一個可以刪除雙鏈表中倒數第K個節點。 要求 如果連結串列長度為n,則要時間複雜度達到O(N),額外空間複雜度達到O(1). 思路 一種方法是設定快慢指標,快指標先走k步,此時慢指標從頭開始走,兩者同時開始走,當

2.2在單鏈和雙鏈刪除倒數K節點

題目 分別實現兩個函式,分別可以刪除單鏈表和雙鏈表中倒數第K個節點。 思路 兩次遍歷連結串列,第一遍每移動一步,就讓K值減1;第二遍從頭開始遍歷連結串列,每移動一步K值加1,加到0就停止遍歷,此時移動到的節點就是要刪除節點的前一個節點。 程式碼實現 c

java實現---查詢單鏈倒數K節點,要求只能遍歷一次連結串列;;;刪除連結串列的倒數k節點

java實現 查詢單鏈表的倒數第K個節點,要求只能遍歷一次連結串列 刪除連結串列的倒數第k個節點 查詢單鏈表的倒數第K個節點,要求只能遍歷一次連結串列 定義兩個前後節點forward和backward 先

單鏈刪除倒數k節點(java實現)

實現方式很多,在這裡只說兩種實現方式。看不懂時候,大家可以畫畫圖,對理解為什麼很有幫助。 第一種方式: 1.首先判斷K值和連結串列是否為空,如果k<=0,或連結串列為空,直接返回head; 2.滿足上面條件後,定義ListNode P=head,重頭

刪除單鏈倒數K節點

/** * Created by lxw, [email protected] on 2017/10/27. * 刪除單鏈表中倒數第K個結點 */ public class TheLa

單鏈刪除倒數K節點 Python 版

題目: 給定一個連結串列,刪除其中倒數第k個結點。 程式碼: class LinkedListAlgorithms(object): def __init__(self): pass def rm_last_kth_nod

連結串列問題——在單鏈和雙鏈刪除倒數K節點

【題目】   分別實現兩個函式,一個可以刪除單鏈表中倒數第K個節點,另一個可以刪除雙鏈表中倒數第K個節點。 【要求】   如果連結串列長度為N,時間複雜度達到O(N),時間複雜度達到O(N),額外空間複雜度達到O(1) 【解答】   本題較為簡單,實現

問題----刪除倒數K節點

double created com 復雜度 lis 基本 dem pan ont 在單鏈表和雙鏈表中刪除倒數第K個節點      分別實現兩個函數,一個可以刪除單鏈表中的倒數第K個節點,一個可以刪除雙鏈表中的倒數第k 個節點,要求時間復雜度是 O(N),空間復雜度是 O(

查詢單鏈倒數k節點,要求只能遍歷一次連結串列

為了得到倒數第k個結點,很自然的想法是先走到連結串列的尾端,再從尾端回溯k步。可是輸入的是單向連結串列,只有從前往後的指標而沒有從後往前的指標。因此我們需要開啟我們的思路。既然不能從尾結點開始遍歷這個連結串列,我們還是把思路回到頭結點上來。假設整個連結串列有n個

一:單鏈——③查詢倒數k節點(O(1))

製作人  :TheShyclear 製作時間:2018-7-21 製作內容:查詢單鏈表中的倒數第k個數據 版本號 :8.0 缺陷:頭節點只能插入一次,不能在1號節點出插入,詳細看Insert函式 注意:頭指標的不可改變性 思路:單鏈表中的許多問題需要用到兩個指