day41-链表倒数第K个
【2009统考真题】已知一个带有表头结点的单链表,结点结构为
Data Link 假设该链表只给出了头指针 list,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k正整数)。若查找成功,算法输出该结点的data域的值,并返回1;否则只返回0。要求: (1)描述算法的基本设计思想。 (2)描述算法的详细实现步骤。 (3)根据设计思想和实现步骤,采用程序设计语言描述算法(使用C、C++或Java语言实现),关 键之处请给出简要注释。
题源:【2009 408数据结构统考真题】
思路: 问题的关键是设计一个性能尽可能好的算法,先对链表遍历一遍,对链表求长度
然后通过计算得出节点在链表之中的位置,公式:链表长度-k(倒数第k个节点)+1;
定义一个节点的结构体,内部含有该节点的值和下个节点next;
//定义一个方法,得出该节点后面的节点个数总数
//遍历节点,当链表长度-倒数第几个+1 就是要找的节点;
//返回该节点的value值
//定义一个节点的结构体,内部含有该节点的值和下个节点next;
struct ListNode {
int value;
ListNode* next;
//定义一个方法,得出该节点后面的节点个数总数
int length(ListNode* node) {
int l = 0;
while( node->next != nullptr) {
node = node->next;
l++;
}
return l;
}
};
int f(ListNode* list,int k) {
//遍历节点,当链表长度-倒数第几个+1 就是要找的节点;
for( int i = 0; i < list->length(list)- k + 1; i++ ) {
list = list->next;
}
//返回节点的值
return list->value;
}
最差时间复杂度:O(2n);
最好时间复杂度:O(n);
空间复杂度:O(1);