本文主要是介绍leetcode 剑指offer22 链表倒数第k个节点 双指针法 代码鲁棒性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接
剑指 Offer 22. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
一道easy的题目,最简单的方法就是先遍历得到链表的长度,然后将指针移动到倒数第k个节点上:
AC代码:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* getKthFromEnd(ListNode* head, int k) {ListNode* pre = head;int len = 0;while(head!=NULL){head = head->next;len++;}//cout<<len<<endl;for(int i=0; i<len-k;i++) pre = pre->next;return pre;}
};
优化解法:双指针法,第一个指针领先第二个指针k个节点,那么当第一个节点走到尾节点后的空节点时,第二个指针正好是所求位置。
AC代码
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* getKthFromEnd(ListNode* head, int k) {//一次遍历ListNode* first = head;ListNode* second = head;while(k--){first = first->next;}while(first!=NULL){first = first->next;second = second->next;}return second;}
};
代码鲁棒性审视:
- 传入指针为空指针;
- 输入的k为0;
- k大于链表的长度.
三种情况下均返回空指针:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* getKthFromEnd(ListNode* head, int k) {if(head == NULL || k==0) return NULL; //前两种情况特判//一次遍历ListNode* first = head;ListNode* second = head;for(int i=0; i<k;i++){if(first != NULL) first = first->next;else return NULL;}while(first!=NULL){first = first->next;second = second->next;}return second;}
};
这篇关于leetcode 剑指offer22 链表倒数第k个节点 双指针法 代码鲁棒性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!