• 【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已经遍历完链表)

    1. class Solution {
    2. public ListNode reverseList(ListNode head) {
    3. if(head==null){
    4. return head;
    5. }
    6. //正常情况
    7. ListNode cur=head.next;
    8. head.next=null;
    9. while(cur!=null){
    10. ListNode curN=cur.next;
    11. cur.next=head;
    12. head=cur;
    13. cur=curN;
    14. }
    15. return head;
    16. }
    17. }

    链表的中间结点

    给定一个带有头结点 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针对的是链表长度是数的情况

    1. class Solution {
    2. public ListNode middleNode(ListNode head) {
    3. ListNode slow=head;
    4. ListNode fast=head;
    5. while(fast!=null&&fast.next!=null){
    6. slow=slow.next;
    7. fast=fast.next.next;
    8. }
    9. return slow;
    10. }
    11. }

    返回倒数第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

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

    • fast=fast.next
    • slow=slow.next
    1. class Solution {
    2. public int kthToLast(ListNode head, int k) {
    3. ListNode fast=head;
    4. ListNode slow =head;
    5. int count=0;
    6. while(count<k){
    7. fast=fast.next;
    8. count++;
    9. }
    10. while(fast!=null){
    11. fast=fast.next;
    12. slow=slow.next;
    13. }
    14. return slow.val;
    15. }
    16. }

    合并两个链表

    将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。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;

    1. class Solution {
    2. public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    3. ListNode headH=new ListNode();
    4. ListNode cur=headH;
    5. while(list1!=null&&list2!=null){
    6. if(list1.val<list2.val){
    7. cur.next=list1;
    8. list1=list1.next;
    9. cur=cur.next;
    10. }
    11. else{
    12. cur.next=list2;
    13. list2=list2.next;
    14. cur=cur.next;
    15. }
    16. }
    17. if(list1==null){
    18. cur.next=list2;
    19. }
    20. if(list2==null){
    21. cur.next=list1;
    22. }
    23. return headH.next;
    24. }
    25. }

  • 相关阅读:
    Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单
    ❤️新版Linux零基础快速入门到精通——第一部分❤️
    洛谷P8395 Good Fours and Good Fives
    谈谈uni-app
    造车先做三蹦子220101--机器学习字符(字母、和数字识别)的“小白鼠”与“果蝇”
    生物信息学 | 借助 AI 更高效地开启研究
    新版ubuntu20.04 使用root用户并自动登录
    四六级同义替换——适用于听力阅读
    对抗生成网络GAN系列——WGAN原理及实战演练
    【牛客网-前端笔试题】——Javascript专项练习6
  • 原文地址:https://blog.csdn.net/2301_80898480/article/details/138197230