为了转行程序员而努力的第二十九天-链表,接口

为了转行程序员而努力的第二十九天-链表,接口,第1张

为了转行程序员而努力的第二十九天-链表,接口

又是做噩梦早醒了,似乎已经习惯了,所以反而觉得没有那么失落了,慢慢也开始习惯了每天刷题,对着一道题卡住,然后最终解决,再总结为什么卡在那里。虽然还是会焦虑,但是没有之前那么焦虑了,保持目前的状态,静下心来积累知识,链表练习了三天了,今天明显比前两天熟练了,而且也可以脱离官方答案自己想出方法修bug了,反复练习是有用的,哪怕刚开始只是把官方答案复写一遍,坚持练习也是有用的。

今日进度:
1.坚持刷题,虽然链表刷得很艰难,但是有在提高,是有用的
2.坚持录小王子,其实已经中断两天了
3.坚持锻炼
4.坚持记录,刷完题不认真总结相当于没有刷

学习笔记:
1.在Java中,类的多重继承是不合法,但接口允许多重继承。
在接口的多重继承中extends关键字只需要使用一次,在其后跟着继承接口。 如下所示:

public interface Hockey extends Sports, Event

2.没有任何方法的接口被称为标记接口。
标记接口主要用于以下两种目的:
建立一个公共的父接口:正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。
向一个类添加数据类型:这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。
3.包的作用
(1)把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
(2)如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
(3)包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
Java使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
4.包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
5.为了能够使用某一个包的成员,我们需要在 Java 程序中明确导入该包。使用"import"语句可完成此功能。
6.19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

解题思路:先遍历一遍到链表的长度,再遍历一遍到n-k个节点;两个指针p,q使p在虚拟头节点,q移动n+1次,两个指针同步移动,直到q到达链表尾部

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dn = new ListNode(0,head);
        ListNode slow = dn;
        ListNode fast = dn;
        for(int i=0; i 

7.61. 旋转链表
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k个位置。

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

解题思路:相当于数组需要向右移动k mod n次,可以设置两个指针,fast指针比slow多移动move个节点,在一起移动两个节点,知道fast到尾部,slow指向的下一个节点就是新的头节点的位置,将slow的next设为空,fast指向head,返回新的头节点即可。

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head==null || head.next==null || k==0){
            return head;
        }
        int n = 0;
        ListNode dn = new ListNode(0,head);
        ListNode slow = dn;
        ListNode fast = dn;
        ListNode lent = dn;
        while(lent.next!=null){
            n++;
            lent = lent.next;
            
        }
        int move = k % n;
        if(move == 0){
            return head;
        }
        for(int i=0; i 

8.143. 重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

输入:head = [1,2,3,4]
输出:[1,4,2,3]
提示:
链表的长度范围为 [1, 5 * 10^4]
1 <= node.val <= 1000

解题思路:先通过快慢指针找到链表的中点,将右边部分的链表反转,在将两个链表依次按顺序合并起来。实现的时候可能会遇到划分中点的问题,无论是奇数还是偶数链表,slow指针的下一个节点始终是右边链表头节点,在合并链表的时候,左边的节点下一个指向右边,右边的下一个又指向左边,如果左边的链表为空时,应该不修改下一个右边链表节点的指向。

class Solution {
    public void reorderList(ListNode head) {
        if(head.next==null){
            return;
        }
        ListNode dn = new ListNode(0,head);
        ListNode slow = dn;
        ListNode fast = dn;
        while(fast.next!=null && fast.next.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode nh = slow.next;
        slow.next = null;
        nh = reverse(nh);
        merge(head,nh);
    }
    public ListNode reverse(ListNode nh){
        ListNode pre = null;
        while(nh != null){     
            ListNode next = nh.next;
            nh.next = pre;
            pre = nh;
            nh = next;
        }
        return pre;
    }
    public void merge(ListNode head, ListNode nh){
        ListNode tmp1;
        ListNode tmp2; 
        while(head!=null && nh!=null){      
            tmp1 = head.next;
            tmp2 = nh.next;
            head.next = nh;
            head = tmp1;
            if(head!=null){
                nh.next = head;
                nh = tmp2;
            }
        }
    }
}

9.237. 删除链表中的节点
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问要被删除的节点 。
题目数据保证需要删除的节点不是末尾节点 。

输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9

解题思路:将当前节点的下一个节点值复制给当前节点,再将当前节点删除,如果当前节点为最后一个,则直接令当前节点等于null。

class Solution {
    public void deleteNode(ListNode node) {
        if(node.next==null){
            node = null;
        }
        ListNode next = node.next;
        node.val = next.val;
        node.next = next.next;
    }
}

差点漏了一道简单的题,还好很快就补上了,今天刷题太入迷,有点晚了,明天再运动和录小王子,又是周末了,下午久违地准备去看演出,还挺难得的,明日继续更新。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5709878.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存