【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;
    }
}
相关推荐
浮游本尊5 分钟前
Java学习第22天 - 云原生与容器化
java
渣哥2 小时前
原来 Java 里线程安全集合有这么多种
java
间彧2 小时前
Spring Boot集成Spring Security完整指南
java
间彧2 小时前
Spring Secutiy基本原理及工作流程
java
Java水解3 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆6 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学6 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole6 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊6 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端