[每日两题系列]刷算法题咯~~

        本系列所选题目均来自力扣或者牛客网站. 所选题目主要是以其中的简单题为主, 中等题为辅, 包含少数困难题(原因是: 本人目前能力还不够~ ). 开展这个系列的目的是督促自己, 在暑假的时间里也要保持有一定的刷题量, 拒绝摆烂~
        话不多说, 直接开刷~~ 今天的题目都是与链表相关的.

从尾到头打印链表

        题目描述: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

解题思路:
        (1) 刚开始看到这道题 — 从尾到头打印链表~~ 这不就是妥妥的将链表逆序的题目嘛. 于是, 我就直接开始刷刷刷地做了起来, 直到最后一步, 看到这个方法的返回值, 居然是一个数组, 想到还要在重新遍历一遍, 想想等一下执行起来的时间效率可能会比较低, 干脆直接换一种思路. 就想到了直接使用栈不就行了, 栈有先进后出的特点, 出的时候把他们存到一个数组里面, 这不就天衣无缝了, 于是刷刷刷又开始做了起来…
        (2) 上来直接遍历这个链表, 获取到一个值, 就将其存到栈里面, 直到把链表遍历完. 出栈将每一个元素的val值存到数组里面, 最后直接返回这个数组即可.

实现代码:

class Solution {
    public int[] reversePrint(ListNode head) {
        Stack<ListNode> stack=new Stack<>();
        while(head!=null){
            stack.push(head);
            head=head.next;
        }
        int size=stack.size();
        int[] array=new int[size];
        for(int i=0;i<size;i++){
            array[i]=stack.pop().val;
        }
        return array;
    }
}

移除重复节点

        题目描述: 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

解题思路:
        (1) 这道题一上来就有种似曾相识的感觉, 这不就是删除重复节点嘛… 于是我又进行了一顿操作(使用传统的前后指针法), 最后运行报错, 才恍然大悟, 它给的这链表是没有进行排序的, 是不能够使用传统的前后指针法的(除非先对这个链表进行排序, 但是这又是另一道工程, 等一下可能会时间复杂度太大了), 我就换了个思路: 不能重复, 那我使用Set来对链表进行存储, 不就不会重复了嘛. 于是, 又开始刷刷刷…
        (2) 先定义一个Set, 将头节点的val值存到set里面去.
        (3) 循环遍历这个链表, 当然, 这里还是需要使用前后指针法(逃不掉的), 前指针用来判断该节点的val值是否在哈希表中存在, 如若不存在, 则直接在哈希表中添加这个元素, 然后前后指针一起往前走即可; 如若存在, 那么后指针不动, 前指针往前走一步(一次next), 如此往复循环(此过程中, 后指针的next都是指向前指针的).
        (4) 最后, 这个链表就已经被改成没有重复节点的了, 直接返回链表头节点即可.

实现代码:

class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        if(head==null){
            return null;
        }
        Set<Integer> set=new HashSet<>();
        set.add(head.val);
        ListNode cur=head;
        while(cur.next!=null){
            ListNode curNext=cur.next;
            if(set.add(curNext.val)){
                cur=cur.next;
            }else{
                cur.next=cur.next.next;
            }
        }
        return head;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡欣致

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值