本系列所选题目均来自力扣或者牛客网站. 所选题目主要是以其中的简单题为主, 中等题为辅, 包含少数困难题(原因是: 本人目前能力还不够~ ). 开展这个系列的目的是督促自己, 在暑假的时间里也要保持有一定的刷题量, 拒绝摆烂~
话不多说, 直接开刷~~ 今天的题目都是与链表相关的.
从尾到头打印链表
题目描述: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
解题思路:
(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;
}
}