leetcode每日刷题之链表篇(一)链表中倒数第k个节点,删除链表的节点,从尾到头打印链表


前言

百度百科:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

一、链表中倒数第k个节点

在这里插入图片描述

题目描述

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
这个题想明白比较简单,很容易做到100%,但是想不到的话做起来就不容易了。
我的想法是构建两个指针,等第一个指针走到第K个值的时候第二个指针开始出发,两个指针的距离始终相距K。然后等第一个到达尾部的时候第二个指针刚好到达倒数第k个节点。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
过程大概就是这样的

class Solution {
    
    
    public ListNode getKthFromEnd(ListNode head, int k) {
    
    
         ListNode fast = head;//前面的指针
         ListNode slow = head;//后面的指针
         for(int i=0;i<k-1;i++){
    
    
             fast = fast.next;
         }
         while(head.next!=null){
    
    
             fast = fast.next;
             slow = slow.next;
         }
        return slow;
    }
}

二、删除链表的节点

在这里插入图片描述

题目描述

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
注意:此题对比原题有改动
示例 1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
题目解析:这个题的思路和上个题的思路类似,上一个是跟在后面K位,这个是跟在前指针的屁股后面,等他查到需要删除的值时,把前指针的下一位赋值给后指针的下一位。
代码:

class Solution {
    
    
    public ListNode deleteNode(ListNode head, int val) {
    
    
        ListNode thrum = new ListNode(-1);
        thrum.next= head; 
        //定义两个指针
        ListNode headhead =thrum
        ListNode fronthead =thrum.next;
        while(fronthead!=null){
    
    
            if(fronthead.val==val){
    
    
            //查找到需要删除的值
            headhead.next= fronthead.next;
            return thrum.next;
            }
            else{
    
    
                headhead=headhead.next;
                fronthead=fronthead.next;
            }            
        }
      
        return  thrum.next;

三 、从尾到头打印链表

在这里插入图片描述

题目描述

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
题目解析:我的思想是先遍历链表得到链表的长度,然后再创建一个数组,将链表从数组尾部赋值,就实现了从尾到头打印链表
代码


```java
class Solution {
    
    
    public int[] reversePrint(ListNode head) {
    
    
         int i = 0;
         ListNode headtwo = head;
         //遍历链表
        while(head!=null){
    
    
            head=head.next;
            i++;
        }
        int[] sites = new int[i];
        //从后往前为数组赋值
        for(int t =i-1;t>=0;t--){
    
    
            sites[t]=headtwo.val;
            headtwo=headtwo.next;
        }
        return sites;
    }
}

题目来源:https://leetcode-cn.com/problemset/all/

总结

总的来说这些题目较简单,适合新手做,链表的简单题比数组的简单题要简单一些。

猜你喜欢

转载自blog.csdn.net/tan45du_yuan/article/details/108684464