描述
输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
解题思路
将倒数第K个转为正数第index个 时间复杂度为O(n),空间复杂度为O(1)
func FindKthToTail( pHead *ListNode , k int ) *ListNode {
count := 0
head := pHead
for head != nil {
// 计算链表长度
count++
head = head.Next
}
// 将倒数第k个转为正数第index个
index := count - k
// 如果超出链表长度限制
if index < 0{
return nil
}
for pHead != nil && index > 0 {
index--
// 去掉多余的节点
pHead = pHead.Next
}
return pHead
// write code here
}快慢指针实现 时间复杂度为O(n),空间复杂度为O(1)
- 因为是倒数第k个,所以我们先让快指针先走k步
- 如果fast指针为null,那么说明超过了链表长度限制,返回null
- 如果fast走了k步,且不为null,那么我们再用慢指针从头节点和快指针一起走,直到快指针为null.返回慢指针
public ListNode FindKthToTail(ListNode pHead, int k) { // 判断链表头是否为空 if (pHead == null) { return null; } // 将快指针指向头节点 ListNode fast = pHead; int i = 0; while (k > i) { // 当fast为空表示越界 if (fast == null){ return null; } // 继续向后走 fast = fast.next; i++; } // 将慢指针指向链表头 ListNode slow = pHead; // 循环结束的条件为快指针走到结尾 while (fast != null) { fast = fast.next; slow = slow.next; } // 返回慢指针 return slow; }快慢指针算法图例,以k等于2来举例,链表为1->2->3->4->5

京公网安备 11010502036488号