[water_rearTopNode]链表中倒数第k个结点

链表中倒数第k个结点

http://www.nowcoder.com/questionTerminal/529d3ae5a407492994ad2a246518148a

思路:

用两种方法:
1.设一个pre在p跑了k个单位后再一起移动到结尾
2.直接把整个list给反转过来,三指针,练手,这里会输出node[k]之后所有所以不能用(这种跟递归差不多,但直接递归无法处理返回ind和返回node,封装个专门回传的对象应该可以,还有就是存入栈那空间换时间)

struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};
//2:12--2:39
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode *p = pListHead;
        while(k--){
            if(pListHead == NULL)//居然会出越界的k。。。
                return NULL;
            pListHead = pListHead->next;
        }
        while(pListHead != NULL){
            pListHead = pListHead->next;
            p = p->next;
        }
        return p;
    }
};
//2:44--3:00
//这个版本在输出的时候发现node[k]下面的所有节点也别输出了,所以他是遍历node[k]下面的节点的,逆序不能用
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode* head=NULL, *mid=pListHead, *tail=NULL;
        if(pListHead == NULL)
            return NULL;
        else
            tail=pListHead->next;
        while(mid != NULL){
            mid->next=head;
            head = mid;
            mid = tail;
            tail = tail->next;
        }
        while(head!=NULL&&--k){
            head=head->next;
        }
        return head;
    }
};
全部评论
请问一下为什么会出现倒数第k个结点后的结点呢
点赞 回复 分享
发布于 2020-06-18 19:52
不好意思当时头脑不是很清晰。 我那个说的是第二种的方法原理就像递归实现后序遍历,但题目是要返回倒数k的节点,递归函数的返回类型是node,这样一来在到达底端最后一个node在回来的时候我怎么知道是倒数第k个呢,最直白是弄个计数器。我很讨厌用全局变量(这里是类的成员变量)因为感觉破坏了函数的封闭,所以我当时就习惯性的以为计数器只能用返回一个整形来实现,那这样又要返回节点又要返回一个用于计数的int就矛盾了除非用一个结构体吧计数器和node整合为一个对象就满足单个返回有兼有两个信息。(漏洞是忽略了全局)😂是完全可以的其实,就是我做算法的时候个人好恶太严重有时顺理成章就pass一些东西
点赞 回复 分享
发布于 2020-06-18 22:46

相关推荐

饼子吃到撑:当我看到外企的时候,我就知道这大概率可能是真的
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务