版權聲明:本文為博主原創文章,未經博主允許不得轉載。
難度:容易
要求:
找到單鏈表倒數第n個節點,保證鏈表中節點的最少數量為n
樣例
給出鏈表** 3->2->1->5->null**和n = 2,返回倒數第二個節點的值1.
思路:
先翻轉,再計算
/**
* @param head: The first node of linked list.
* @param n: An integer.
* @return: Nth to last node of a singly linked list.
*/
ListNode nthToLast(ListNode head, int n) {
if(head == null){
return null;
}
head = reverse(head);
int index = 1;
while(head.next != null){
if(index++ == n){
break;
}
head = head.next;
}
return head;
}
/**
* 原地翻轉
*/
private ListNode reverse(ListNode head){
ListNode prev = null;
while(head != null){
ListNode tmp = head.next;
head.next = prev;
prev = head;
head = tmp;
}
return prev;
}
思路:
雙指針,第一個指針先走n個,然后第一個指針和第二個指針同時往右遍歷,當第一個指針為null時,第二個指針就為倒數第n個元素
/**
* @param head: The first node of linked list.
* @param n: An integer.
* @return: Nth to last node of a singly linked list.
*/
ListNode nthToLast(ListNode head, int n) {
if(head == null){
return null;
}
ListNode dummy = head;
for(int i = 0; i < n; i++){
if(head == null){
return null;
}
head = head.next;
}
ListNode pre = dummy;
while(head != null){
head = head.next;
pre = pre.next;
}
return pre;
}