題目描述
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
public class FindKthToTail_14 {
//雙指針
public static ListNode_14 FindKthToTail1(ListNode_14 head,int k) {
ListNode_14 p1, p2;
p1 = p2 = head;
int i = 0;
for (; p1 != null; i++) {
//從第k步開始,第二個指針也從頭指針開始遍歷,兩個指針距離始終保持在k-1
//當第一個指針到達鏈表的尾結點時嗎,第二個指針正好是倒數第k個節點
if (i >= k)
p2 = p2.next;
p1 = p1.next;
}
return i < k ? null : p2;
}
public static ListNode_14 FindKthToTail(ListNode_14 head,int k) {
int totalNum = 0;
if(head != null){
totalNum++;
}else{
return null;
}
// 計算總的節點數量
ListNode_14 currentNode = head.next;
while(currentNode != null){
totalNum++;
currentNode = currentNode.next;
}
if(totalNum < k){
//throw new RuntimeException("k的值超過了鏈表長度");
return null;
}
// 倒數第k個爲正數第totalNum-k+1個
ListNode_14 resultNode = head;
for(int i=1; i<=totalNum-k; i++){
resultNode = resultNode.next;
}
return resultNode;
}
public static void main(String[] args) {
ListNode_14 root = new ListNode_14(1);
root.next = new ListNode_14(2);
root.next.next = new ListNode_14(3);
root.next.next.next = new ListNode_14(4);
root.next.next.next.next = new ListNode_14(5);
ListNode_14 result = FindKthToTail1(root,2);
System.out.println(result.val);
}
}