输入一个链表,输出该链表中倒数第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,还可以。不过真的有点遗憾,那几个方法真不错,要是这个链表指针多一个指向成员就好了,双向链表太香了。