【劍指offer】-鏈表中倒數第K個結點-14/67

1. 題目描述

輸入一個鏈表,輸出該鏈表中倒數第k個結點
假設題目爲: 3 【1,2,3,4,5,6】

2. 題目思路

2.1 第一種思路:兩個結點分別跑

1 判斷當前給的鏈表head是不是null,如果是的話,返回null
2. 判斷k的值,如果k的值,小於等於0,返回null
3. 建立兩個結點,指向head(注意:這裏一定要明白當前鏈表是不是有頭結點的,該題不含有頭結點)
鏈表
4. 先讓p1結點跑k-1(2)次(要時刻注意,p1.next是否走到了null)在這裏插入圖片描述
5. 然後p1和p2同時開始跑,等到p1.next跑到null時,p2所指的指針就是倒數第K(3)個結點在這裏插入圖片描述

2.2 第二種思路:一個結點跑

1 判斷當前給的鏈表head是不是null,如果是的話,返回null
2. 判斷k的值,如果k的值,小於等於0,返回null
3. 建立一個結點,遍歷一遍鏈表,找到鏈表的長度len在這裏插入圖片描述
4. 重新定義結點p1,此時,num = (len - k + 1)就是鏈表在結點中的位置,位置必須大於0
5. 此時鏈表p1指向第一個數值。所以,只需要跑num - 1次,即可找到倒數第K個數

3. 題目代碼

3.1 第一種思路:兩個結點分別跑

public ListNode FindKthToTail(ListNode head,int k) {
           if(head == null || k <= 0){
               return null;
           }
            ListNode p1 = head;
            ListNode p2 = head;
            for(int i = 0; i < k - 1; i++){
                if(p1.next == null){
                    return null;
                }else{
                    p1 = p1.next;
                } 
            }
        while(p1.next != null){
            p1 = p1.next;
            p2 = p2.next;
        }
        return p2;
    }

3.2 第二種思路:一個結點跑

public ListNode FindKthToTail(ListNode head, int k) {
		if (head == null || k <= 0) {
			return null;
		}
		ListNode p1 = head;
		int len = 0;
		while (p1 != null) {
            p1 = p1.next;
			len++;
		}
		int num = len - k + 1;
        p1 = head;
		if (num <= 0) {
			return null;
		}
		for (int i = 1; i < num; i++) {
			p1 = p1.next;
		}
		return p1;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章