203.移除元素
比较简单,定义两个虚拟头节点,执行跳过就ok
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode pre = new ListNode(-1);
pre.next = head;
ListNode tmp = pre;
while(pre.next != null){
if(pre.next.val == val){
pre.next=pre.next.next;
}else{
pre = pre.next;
}
}
return tmp.next;
}
}
707.设计链表
这道题挺经典的,自己设计一个链表的数据结构,我觉得核心在于自己定义的链表基础数据结构ListNode
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
通过嵌套的方式,将下一个节点与该节点产生连接。
其他函数就是简单的模拟,注意按照题目要求梳理函数逻辑即可
class MyLinkedList {
int size;
ListNode head;
public MyLinkedList() {
size = 0;
head = new ListNode(0);
}
public int get(int index) {
if(index<0 || index>=size){
return -1;
}
ListNode cur = head;
while(index>=0){
cur = cur.next;
index--;
}
return cur.val;
}
public void addAtHead(int val) {
size++;
ListNode tmp = new ListNode(val);
tmp.next = head.next;
head.next = tmp;
}
public void addAtTail(int val) {
addAtIndex(size, val);
}
public void addAtIndex(int index, int val) {
if(index>size){
return ;
}
size++;
index = Math.max(0, index);
ListNode pre = head;
for(int i=0;i<index; i++){
pre = pre.next;
}
ListNode tmp = new ListNode(val);
tmp.next = pre.next;
pre.next = tmp;
}
public void deleteAtIndex(int index) {
if(index<0 ||index>=size){
return ;
}
size--;
ListNode pre = head;
for(int i=0;i<index; i++){
pre = pre.next;
}
pre.next = pre.next.next;
}
}
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
206.反转链表
这道题一个月前做过,那个动画一直在脑子里存在,如何断开,指向反转,基本就是对这个过程的模拟。后续相关的题目就是在于反转部分,给个参数n,反转前n,反转后n,反转中间n,反正核心是反转
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = head;
ListNode cur = null;
while(pre != null){
ListNode tmp = pre.next;
pre.next = cur;
cur = pre;
pre = tmp;
}
return cur;
}
}