首页 > 其他分享 >AcWing 33:链表中倒数第k个节点 ← 尾插法

AcWing 33:链表中倒数第k个节点 ← 尾插法

时间:2024-06-08 21:28:42浏览次数:28  
标签:插法 int next 链表 33 Input NULL

【题目来源】
https://www.acwing.com/problem/content/32/

【题目描述】
输入一个链表,输出该链表中倒数第 k 个结点。

注意:
    ● k >= 1;
    ● 如果 k 大于链表长度,则返回 NULL;

【数据范围】
链表长度 [0,30]。

【输入样例】
输入:链表:1->2->3->4->5 ,k=2

【输出样例】
输出:4

【算法分析】
● 假设链表有 n 个结点,那么只要从头结点开始往后走 n-k 步就可以到达倒数第 k 个结点(从 1 开始计数)。
● 头插法及尾插法
头插法创建单链表:https://blog.csdn.net/hnjzsyjyj/article/details/120285274
尾插法创建单链表:https://blog.csdn.net/hnjzsyjyj/article/details/120285300
本题算法,选用尾插法建立单链表。
● ​​​​​​​适应本例类风格的代码如下所示:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
    public:
        ListNode* findKthToTail(ListNode* head, int k) {
            int cnt=0;
            ListNode* p=head;
            while(p) {
                cnt++;
                p=p->next;
            }

            if(cnt<k) return NULL; //nullptr

            p=head;
            for(int i=0; i<cnt-k; i++) p=p->next;
            return p;
        }
};


【利用尾插法构建单链表后求解的完整代码】

#include <bits/stdc++.h>
using namespace std;

struct LNode {
    int data;
    LNode *next;
};
typedef struct LNode *LinkList;

void Tail_Insert(LinkList &L) {
    L=new LNode;
    L->next=NULL;
    LinkList r=L;

    printf("Input value:");
    int x;
    while(scanf("%d",&x)!=EOF) {
        LinkList p;
        p=new LNode;
        p->data=x;
        p->next=NULL;
        r->next=p;
        r=p;
    }
}

void findKthToTail(LinkList &L,int k) {
    LinkList tail=L, head=L;
    if(k<=0) {
        printf("Input error!\n");
        return;
    }

    for(int i=1; i<=k; i++) {
        tail=tail->next;
        if(tail==NULL) {
            printf("No such node!\n");
            return;
        }
    }

    while(tail!=NULL && head!=NULL) {
        tail=tail->next;
        head=head->next;
    }
    printf("%d\n",head->data);
}

int main() {
    int k;
    LinkList L=new LNode;
    L->next=NULL;

    Tail_Insert(L);

    printf("Input k:");
    while(scanf("%d",&k)!=EOF) {
        findKthToTail(L,k);
        printf("Input k:");
    }
    return 0;
}


/*
Input value:9 6 2 8 5
^Z
Input k:3
2
Input k:2
8
Input k:5
9
Input k:1
5
Input k:12
No such node!
Input k:-12
Input error!
Input k:
*/




【参考文献】
https://blog.csdn.net/zwb8848happy/article/details/7330586
https://www.acwing.com/video/2698/








 

标签:插法,int,next,链表,33,Input,NULL
From: https://blog.csdn.net/hnjzsyjyj/article/details/139486057

相关文章

  • 链表-循环链表
    循环链表可以像链表一样只有单向引用,也可以像双向链表一样有双向引用。循环链表和链表之间唯一的区别在于最后一个元素指向下一个元素的指针(tail.next)不是引用undefined,而是指向第一个元素(head).单链表:this.tail.next=this.head;双向链表:this.tail.next=this.head;......
  • 代码随想录算法训练营第四天 Leetcode 24 两两交换链表节点 Leetcode19 删除链表倒数
    链表问题首先要记住设置虚拟头节点Leetcode24两两交换链表节点题目链接思路:就是简单模拟两两交换 要注意链表节点的处理一定要获取到合适的位置比如:这一题中两个交换节点的前一个节点注意链表保存临时节点/***Definitionforsingly-linkedlist.*publicclas......
  • 代码随想录算法训练营第五十天| 198.打家劫舍、213.打家劫舍II、337.打家劫舍 III
    198.打家劫舍文档讲解:代码随想录题目链接:.-力扣(LeetCode) 问题:计算你不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。也就是说相邻的房间不能偷当前房屋偷与不偷取决于前一个房屋和前两个房屋是否被偷了。所以这里就更感觉到,当前状态和前面状态会有一种依赖......
  • 顺序表、链表、栈和队列总结
    目录顺序表链表栈队列总结补充顺序表实现链表实现栈实现队列实现  顺序表、链表、栈和队列都是线性数据结构,但它们在管理和访问数据方面有不同的特点和用途。以下是它们之间的主要区别:顺序表存储方式:在连续的内存空间中存储元素。访问方式:通过索引直接访......
  • Day33 登录注册功能实现
    ​本章节实现了登录注册功能,以及登录成功后,跳转到系统首页一.登录注册页面的切换在MaterialDesign中,有一个Transitioner控件,也就是切换面板控件,它可同时容纳多个不同的窗口内容。其中就有一个属性值:SelectedIndex,根据该属性值来切换呈现不同的选中页内容。注册页......
  • 链表-双向链表
    之前实现的是单向链表,即每个节点有一个元素值和一个指向下一个元素的指针,是单向的.head->a->b->c1.现在来做一个双向的,即对每个节点来说,有两个指针,一个链向下一个元素,另一个链向上一个元素.head-><-b-><-c.链表初始化基本的操作套路和单链表是差不多的......
  • 程序员最应该在30岁之前明白的道理,来自一位33岁码农的顶级感悟!
    从去年开始,互联网就业状况恶劣,从业人员悲观情绪开始蔓延,好多同行都表示被降薪甚至裁员,正在找工作的也表示boss刷烂了都是已读不回。网上的信息真真假假大家自己甄别,我说说自己的一些现状跟观察,希望对大家有参考意义。我目前在广州一家一百多人的小公司,属于交通行业中的软件......
  • day3链表
    题目:https://leetcode.cn/problems/remove-linked-list-elements/submissions/537974263/题目解析:https://programmercarl.com/0203.移除链表元素.html这道题用了dummyHead,会简单非常多,但是需要注意的是,如果不用dummyHead的话,去除head为啥使用while而不是if呢?个人理解是,可......
  • 代码随想录第3天 | 链表 203.移除链表元素,707.设计链表,206.反转链表
    题目:203.移除链表元素思路:主要是头节点的删除问题,一种是直接在原链表上后移头节点设置虚拟头结点,指向原链表的头结点,在设置一个cur指针指向当前节点,虚拟头节点初始化后就不移动了,使用cur进行移动不要忘记释放删除节点的内存,自行设置的虚拟头节点也要释放时间复杂度:O(n)空......
  • 代码随想录训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表
    python定义链表val:数据域,节点存储的元素。next:指针域,指向下一个节点的指针,最后一个节点指向None表示空指针。点击查看代码classListNode:def__init__(self,val,next=None):self.val=valself.next=next203.移除链表元素题目:给你一个链表的......