前言
算法的重要性不言而喻!大厂都在考算法,说明算法不好学,区分度高!
如果我们认为我不进大厂我就不用学算法了,我学学框架,学学能用好不就行了。但是你要知道你的竞争者有多少,你怎么才能跟别人拉开差距???不就是需要基础好,能培养吗?
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,补基础。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
选题、动图来自于:www.programmercarl.com/
提前学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
很好用的Markdown文档
设计链表
思路
这一章节,java不太好理解
如果没有基础,先看C-PrimerPlus和大话数据结构
最后在推荐尚硅谷的数据结构与算法课程,一定是这个顺序!
没有什么拐弯的地方,就是你熟悉链表了,知道CRUD指针是怎么变的了就能写出来
删除节点指针的变化如下:
添加链表节点指针的变化如下:
这一题很考验我们对链表的理解: 首先,listNode为一个val,一个对象的引用(可以理解为指针)
- 获取第index个节点的数值,其实就是遍历,然后返回val
代码如下:
package com.caq.linkList; public class MyLinkedList { int size; ListNode head; //初始化链表 public MyLinkedList() { size = 0; head = new ListNode(0); } //获取第index个节点的数值 public int get(int index) { //如果index非法,返回-1 if (index < 0 || index >= size) { return -1; } ListNode currentNode = head; //包含一个虚拟头节点,所以查找第 index+1 个节点 for (int i = 0; i <= index; i++) { currentNode = currentNode.next; } return currentNode.val; } //在链表最前面插入一个节点 public void addAtHead(int val) { addAtIndex(0, val); } //在链表的最后插入一个节点 public void addAtTail(int val) { addAtIndex(size, val); } public void addAtIndex(int index, int val) { if (index > size) { return; } if (index < 0) { index = 0; } size++; //找到要插入节点的前驱 ListNode pred = head; for (int i = 0; i < index; i++) { pred = pred.next; } ListNode toAdd = new ListNode(val); toAdd.next = pred.next; pred.next = toAdd; } //删除第index个节点 public void deleteAtIndex(int index) { if (index < 0 || index >= size) { return; } size--; ListNode pred = head; for (int i = 0; i < index; i++) { pred = pred.next; } pred.next = pred.next.next; } }