zoukankan      html  css  js  c++  java
  • 链表中倒数第k个结点

    链表中倒数第k个结点

    题目描述

    输入一个链表,输出该链表中倒数第k个结点。

    思想(没想出来:(): 一次遍历同时找出倒数第k个, 利用两个指针变量, 其中一个先走k-1步后, 第二个指针变量开始游走, 直至第一个指针走完整个数组, 此时第二个指针变量指向倒数第k个元素

    版本一来自牛客网, 版本二参考书上思路编的

    版本一: 返回方式太霸道了, return i < k ? NULL : q;把i<k的情况也考虑进去了

    /*
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    			val(x), next(NULL) {
    	}
    };*/
    class Solution {
    public:
        ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
            ListNode *p, *q;
            p = q = pListHead;
            int i = 0;
    
            for (; p != NULL; i++) {
                if (i >= k)
                    q = q->next;
                p = p->next;
            }
            return i < k ? NULL : q;
        }
    };
    

    版本二: 牛客提交报错, vs中的测试通过, 可能测试不全

    /*
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    			val(x), next(NULL) {
    	}
    };*/
    class Solution {
    public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
    	if ((NULL == pListHead) || (NULL == pListHead->next) || (0 == k)) {
    		return NULL;
    	}
        
        ListNode *fcurrent = pListHead->next;
    	ListNode *scurrent = pListHead->next;
    
    	for (decltype(k) i = 0; i < k - 1; i++) {
    		fcurrent = fcurrent->next;
    	}
    
    	while (NULL != fcurrent->next) {
    		scurrent = scurrent->next;
    		fcurrent = fcurrent->next;
    	}
    
    	return scurrent;
    }
    };
    

    版本二的测试程序:

    #include <iostream>
    
    using namespace std;
    
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    		val(x), next(NULL) {
    	}
    };
    
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
    	ListNode *fcurrent = pListHead->next;
    	ListNode *scurrent = pListHead->next;
    
    	if ((NULL == pListHead) || (NULL == pListHead->next) || (0 == k)) {
    		return NULL;
    	}
    
    	for (decltype(k) i = 0; i < k - 1; i++) {
    		fcurrent = fcurrent->next;
    	}
    
    	while (NULL != fcurrent->next) {
    		scurrent = scurrent->next;
    		fcurrent = fcurrent->next;
    	}
    
    	return scurrent;
    }
    
    int main(void) {
    	ListNode head(0), n1(1), n2(2), n3(3), n4(4), n5(5);
    	ListNode *temp = NULL;
    	head.next = &n1;
    	n1.next = &n2;
    	n2.next = &n3;
    	n3.next = &n4;
    	n4.next = &n5;
    
    	temp = FindKthToTail(&head, 5);
    	cout << temp->val << endl;
    }
    
    if ((NULL == pListHead) || (NULL == pListHead->next) || (0 == k)) {
    	return NULL;
    }
    
    ListNode *fcurrent = pListHead->next;
    ListNode *scurrent = pListHead->next;
    
    for (int i = 0; (NULL != fcurrent->next); i++) {
    	if (i >= k - 1) {
    		scurrent = scurrent->next;
    	}
    	fcurrent = fcurrent->next;
    }
    return scurrent;
    
  • 相关阅读:
    uni-appios端app白屏问题
    vue中倒计时假清除
    vue路由守卫
    JS函数命名规范
    VUE生成二维码
    移动端H5之css配置rem
    关于在vue中使用ui库样式无法修改的问题
    v28 error: resource android:attr/dialogCornerRadius not found.
    cocos2d: fullPathForFilename: No file found at script/jsb_prepare.js. Possible missing file
    android studio clean show: CreateProcess error=2, 系统找不到指定的文件。
  • 原文地址:https://www.cnblogs.com/hesper/p/10436534.html
Copyright © 2011-2022 走看看