第一种算法:设置一个指针,先遍历一遍链表得到链表长度,然后再遍历一遍找正着数第(长度-k)个结点的值
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//第一种方法:用一个指针,遍历两次链表
class Solution {
public:
int kthToLast(ListNode* head, int k) {
ListNode* L=head; //此链表应该是不带头结点的链表
int count=0; //存储链表的长度
int n=0;
int real_value=0; //存储第k个结点的值
while(L!=NULL){ //遍历L找到链表的长度
count++;
L=L->next;
}
ListNode* p=head; //第二次遍历链表
while(p!=NULL){
if(n==count-k){ //n的值刚好是倒数第k个结点
real_value=p->val; //real_value存储倒数第k个结点的值
}
p=p->next;
n++;
}
return real_value;
}
};
第二种方法:设置两个指针,进行一次遍历就可以了
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//第二种方法:用两个指针,遍历一次链表即可
class Solution {
public:
int kthToLast(ListNode* head, int k) {
ListNode* p=head; //此链表应该是不带头结点的链表
ListNode* q=head;
int real_value=0;
int n=0;
while(q!=NULL){
if(n!=k-1){
q=q->next;
n++;
}else{
real_value=p->val;
p=p->next;
q=q->next;
}
}
return real_value;
}
};
这篇博客介绍了如何在单链表中寻找第k个倒数节点的两种算法实现。第一种方法是通过遍历两次链表,首先获取链表长度,然后再次遍历找到目标节点。第二种方法则是使用两个指针同步移动,当一个指针到达倒数第k个节点时,另一个指针即为所求节点。这两种方法都适用于不带头结点的链表,可以有效找到所需位置的节点值。
5万+

被折叠的 条评论
为什么被折叠?



