问题
输入一个链表,输出该链表中倒数第k个结点
算法
思路一
求倒数第k个节点,就是求整数第n-k个节点
- 时间复杂度:0(n)
//链表的长度
public int size(ListNode head){
int count = 0;
ListNode temp = head;
if(temp!=null) count++;
while(temp.next!=null){
temp=temp.next;
count++;
}
return count;
}
//求倒数第k个节点,就是求整数第n-k个节点
//复杂度为O(n)
public ListNode FindKthToTail(ListNode head,int k) {
ListNode temp = head;
int size = size(head);
for(int i=0;i<size-k;i++){
temp=temp.next;
}
return temp;
}
思路二:利用栈先进后出的特性
·
先按照顺序遍历然后放到栈中,然后再从栈中取出元素
//利用栈先进后出的特性
//时间复杂度:O(n)
//空间复杂度:O(n)
public ListNode FindKthToTail2(ListNode head,int k){
Stack<ListNode> stack = new Stack<>();
ListNode temp = head;
//将链表中的所有元素都放入到栈中
stack.push(temp);
while(temp.next!=null){
temp=temp.next;
stack.push(temp);
}
//从栈中取元素
ListNode result = null;
for(int i=0;i<k;i++){
result = stack.pop();
}
return result;
}
思路三:利用两个指针
方法三:利用快慢指针,
- 快指针先走k步,
- 然后
快慢指针一起走
,直到块指针走到头
,则此时慢指针走到倒数第k个
public ListNode FindKthToTail3(ListNode head,int k){
//块慢指针
ListNode slow = head;
ListNode quick = head;
//块指针先走k步
for(int i=0;i<k;i++){
quick = quick.next;
}
//块慢指针一起走
//当快指针到末尾了
//慢指针还有k步才到末尾
//正式倒数第k个
while(quick!=null){
quick=quick.next;
slow=slow.next;
}
return slow;
}