在單鏈表中刪除倒數第k個節點

實現方式不少,在這裏只說兩種實現方式。看不懂時候,你們能夠畫畫圖,對理解爲何頗有幫助。
第一種方式:
1.首先判斷K值和鏈表是否爲空,若是k<=0,或鏈表爲空,直接返回head;
2.知足上面條件後,定義ListNode P=head,重頭開始遍歷鏈表,走k步後,退出循環(在此循環中,若是沒到k,p就爲null了,說明沒有倒數第K個節點,k大於表長度了,直接返回head)。
3.定義ListNode q = head,與p同步向後走,直到p的next爲空時候,節點爲要刪除節點的前一個結點。java

第二種方式:
1.首先判斷K值和鏈表是否爲空,若是k<=0,或鏈表爲空,直接返回head;
2.遍歷一遍鏈表,每走一步,讓k值減1.測試

3.遍歷完後,若是k大於零,說明k大於鏈表長度,直接返回head;若是k等於0,要刪除的節點就是頭結點,直接返回head.next;若是k小於0的時候就第4步。
4.定義q=head,重新遍歷節點,每走一步k加1,直到k=0時候,退出循環,此時q的下一個節點就是要刪除的節點。this

(4.解析:在這部分,爲何這樣作,可能不是很容易理解,給你們舉個例子,假如如今有一鏈表有8個節點,k=3.那麼,前三步後,k=-5。你們 想想,k等於三是要刪除倒數第3個節點,咱們只要從頭走5步就能夠到達刪除節點的前一個節點了,爲啥是5,由於8 = 3+5。rem

 

package cglib;
import java.util.Hashtable;  同步

 

public class StringNumber {
    // 2.在單鏈表中刪除倒數第k個節點(方法一)
    public static ListNode removeLastKthNode(ListNode head, int k) {
        if (k <= 0 || head == null)
            return head;
        ListNode p = head;
        for (int i = 0; i < k; i++) {
            if (p.nextNode != null)
                p = p.nextNode;
            else
                return head;
        }
        ListNode q = head;
        while (p.nextNode != null) {
            p = p.nextNode;
            q = q.nextNode;
        }
        q.nextNode = q.nextNode.nextNode;
        return head;
    }table

    // 2.在單鏈表中刪除倒數第k個節點(方法二)
    public static ListNode removeLastKthNode2(ListNode
    head, int k) {
        if(k <= 0 ||head == null)return head;
        ListNode p = head;
        while(p!=null){
            p = p.nextNode;
            k--;
        }
        if(k==0)return head.nextNode;
        if(k<0){
            ListNode q = head;
            while(++k!=0){ //這裏注意,先自加,再判斷
                q=q.nextNode;
            }
            q.nextNode=q.nextNode.nextNode;
        }
        return head;
    }
    // 建立鏈表
    public static ListNode creatListNode(int data[]) {
        ListNode head = new ListNode (data[0]);
        ListNode temp = head;
        for (int i = 1; i < data.length; i++) {
            ListNode headNext = new ListNode(data[i]);
            temp.nextNode = headNext;
            temp = temp.nextNode;
        }
        return head;
    }ast

    // 測試
    public static void main(String[] args) {
        int[] data1 = { 1, 2, 4, 5, 6, 7 };
        ListNode head1 = creatListNode(data1);
        //在單鏈表中刪除倒數第k個節點
        ListNode head = removeLastKthNode2(head1, 1);
        while (head != null) {
            System.out.println(head.values);
            head = head.nextNode;
        }
    }
}class

// 鏈表節點類
class ListNode {
    public int values;
    public ListNode nextNode;import

    public ListNode(int data) {
        this.values = data;
    }
    
}
      List


輸出:

1 2 4 5 6

相關文章
相關標籤/搜索