LeetCode 剑指 Offer 22. 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

  • 原题:

链表中倒数第k个点
或直接转到:
https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/

  • 我的题解
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* getKthFromEnd(struct ListNode* head, int k){
	//struct ListNode MyNode=(ListNode*)malloc(sizeof(struct ListNode));
	/*1.我直接把整个链表倒过来,第一个的next指向的结点的next需要重新指向第一个结点,当然
	第三个结点要先指到第二个结点,这就是一个递归了。算法的第一步就是将整个链表倒过来*/ 
	/*2.上一个方法我失败了,我又想到了一种方法,就是用结构体数组装下每个结点的地址
	与对应的val,角标就是递归次数,可是这里有一个难点,即创建多大的数组,动态创建数组该怎样
	工作,怎样递归,于是我又想了第三种方法*/
	/*3.真给我整难受了,能不能用递归直接输出?*/
	struct ListNode* MyNode=(struct ListNode*)malloc(sizeof(struct ListNode));
	MyNode=head;
	MyNode->next=head->next;
	
	int i,j,s;
	i=0;
	j=0;
	s=0;
	while(MyNode!=NULL){
		MyNode=MyNode->next;
		i++;
	}
	j=i-k;
	while(s<j){
		head=head->next;
        s++;
	}
	return head;
}
骚想法不少,实现起来不简单,前两个方法都是基于链表的灵活使用,如果想到在后续会有更新,要是谁看到了希望提醒一下。前提是我的技术会在刷题期间有提升(ORZ)
屈服于现实,我服从了我的第三个想法,实干方法。
利用循环和变量标记,在循环中丈量出链表的长度。再将链表从头开始循环,到指定次数的时候停止。此时指针指向就是所需结点,整体就是N+N-k次吧,复杂度为n,还可以。不过真的有点遗憾,那几个方法真不错,要是这个链表指针多一个指向成员就好了,双向链表太香了。

LeetCode 剑指 Offer 22. 链表中倒数第k个节点_第1张图片

你可能感兴趣的:(笔记,学习日记,链表,指针,算法,leetcode,c语言)