【Java--数据结构】链表经典OJ题详解(上)

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

谈谈头插、头删、尾插、头插的时间复杂度

反转一个单链表

链表的中间结点

返回倒数第k个结点

合并两个链表


谈谈头插、头删、尾插、头插的时间复杂度

头插和头删的时间复杂度为O(1),

尾插和尾删的时间复杂度为O(n) (因为尾插和尾删要一个个遍历完链表)

反转一个单链表

OJ链接

采用头插法

创建cur指针使得cur=head.next

将head.next置空(作为尾节点)(注意要判断head为空的情况,return head,否则会报空指针异常)

  1. 创建curN指针使得curN=cur.next
  2. 让cur.next=head
  3. head=cur

1~3步是一个循环,进入循环条件是cur!=null(即当cur为空时,代表cur已经遍历完链表)

复制代码
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null){
            return head;
        }
        //正常情况
        ListNode cur=head.next;
        head.next=null;
        while(cur!=null){
            ListNode curN=cur.next;
            cur.next=head;
            head=cur;
            cur=curN;
        }
        return head;
    }
}

链表的中间结点

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结 点。OJ链接

快慢指针法

定义一个慢指针slow(每次走一步),一个快指针fast(每次走两步)

  • 即slow=slow.next
  • fast=fast.next.next

这是一个循环,进入循环的条件为fast!=null&&fast.next!=null(这两个条件不可以交换,否则当fast=null时,先判断fast.next!=null时,会出现空指针异常)

fast!=null针对的是链表长度是数的情况

fast.next!=null针对的是链表长度是数的情况

复制代码
class Solution {
    public ListNode middleNode(ListNode head) {

        ListNode slow=head;
        ListNode fast=head;
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        return slow;
    }
}

返回倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。OJ链接

定义两个节点fast和slow,先让fast走k步,再让fast和slow一起走,当fast走完链表时,此时slow的位置就是倒数第k个节点。(fast和slow之间的距离就是k,当fast走到null时,返回slow.val)

fast先走k步,用count计数,

  • fast=fast.next
  • count++

这是一个循环,条件是count<k(count是从0开始的,所以count<k 就是让fast走了k 步)

接着让fast和slow一起走,进入循环条件是fast!=null

  • fast=fast.next
  • slow=slow.next
复制代码
class Solution {
    public int kthToLast(ListNode head, int k) {
        ListNode fast=head;
        ListNode slow =head;
        int count=0;
        while(count<k){
            fast=fast.next;
            count++;
        }
        while(fast!=null){
            fast=fast.next;
            slow=slow.next;
        }
        return slow.val;
    }
}

合并两个链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。OJ 链接

定义一个哨兵位节点newH,遍历节点tmp

比较A和B链表的值,谁小,就将谁的节点放入新链表中

若A的值小( B同理)

  • tmp.next=headA;
  • headA=headA.next;
  • tmp=tmp.next;

这是一个循环,进入循环条件是headA!=null&&headB!=null(只要有一个链表遍历完了,就跳出循环)

还要判断A走完,B还有的情况(headA=null),(反之同理)

tmp.next=headB;

复制代码
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode headH=new ListNode();
        ListNode cur=headH;
        
        while(list1!=null&&list2!=null){
            if(list1.val<list2.val){             
                cur.next=list1;
                list1=list1.next;
                cur=cur.next;        
            }
            else{
                cur.next=list2;
                list2=list2.next;
                cur=cur.next;
            }
        
        }
        if(list1==null){
            cur.next=list2;
        }
        if(list2==null){
            cur.next=list1;
        }
        return headH.next;
    }
}
相关推荐
devmoon1 分钟前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡
Evand J4 分钟前
TDOA(到达时间差)的GDOP和CRLB计算的MATLAB例程,论文复现,附参考文献。GDOP:几何精度因子&CRLB:克拉美罗下界
开发语言·matlab·tdoa·crlb·gdop
野犬寒鸦5 分钟前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
云姜.8 分钟前
java抽象类和接口
java·开发语言
带刺的坐椅9 分钟前
Claude Code Skills,Google A2A Skills,Solon AI Skills 有什么区别?
java·ai·solon·a2a·claudecode·skills
xyq202418 分钟前
Pandas 安装指南
开发语言
爱学英语的程序员21 分钟前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
xixixin_27 分钟前
【JavaScript 】从 || 到??:JavaScript 空值处理的最佳实践升级
开发语言·javascript·ecmascript
m0_7369191043 分钟前
C++中的委托构造函数
开发语言·c++·算法
lsx2024061 小时前
Python3 SMTP发送邮件教程
开发语言