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;
}