Day41:链表倒数第K个节点

162 阅读2分钟

day41-链表倒数第K个

【2009统考真题】已知一个带有表头结点的单链表,结点结构为

image.png

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);