题目描述
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的。
普通思路
先正向统计一共有多少个节点,然后再正向找到该节点
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int kthToLast(struct ListNode* head, int k){
//找到倒数第k个节点
struct ListNode* p;
p=head;
int j=0;
while(head->next!=NULL){
j++;
head=head->next;
}
j=j-k+1;
while(j!=0){
p=p->next;
j--;
}
return p->val;
}
大佬思路
双指针解法:q指针要比p指针领先k步,这样当q到达链表末端(NULL)时,p指向倒数第k个节点
q先走k步,然后pq一起向前走,q到尾的时候,p指向的就是要找的节点
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int kthToLast(struct ListNode* head, int k){
struct ListNode *p=head,*q=head;//q指针要比p指针领先k步,这样当q到达链表末端(NULL)时,p指向倒数第k个节点
while(k!=0){
q = q->next;
k--;
}
while(q!=NULL){
p=p->next;
q=q->next;
}
return p->val;
}