203.移除链表元素
状态:AC
思路
关键条件:返回新的头节点
注意:要注意只有cur.next.val != val时才移动,否则[7,7,7,7]移除7就会剩下[7,7]
代码
时间复杂度:O(n)
空间复杂度:O(1)
java
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummy = new ListNode(val, head);
ListNode cur = dummy;
while(cur.next != null){
if(cur.next.val == val){
cur.next = cur.next.next;
}else{
cur = cur.next;
}
}
return dummy.next;
}
}
theme: smartblue
707.设计链表
状态:半AC
思路
注意:注意size要加减处理,此外还要注意每种操作的index超出索引的非法情况判断
代码
java
class MyLinkedList {
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
private int size;
private ListNode head; // 哨兵节点
public MyLinkedList() {
this.size = 0;
this.head = new ListNode(0); // 哨兵节点
}
public int get(int index) {
if (index < 0 || index >= size) return -1;
ListNode curr = head.next; // 跳过哨兵
for (int i = 0; i < index; i++) {
curr = curr.next;
}
return curr.val;
}
public void addAtHead(int val) {
ListNode newNode = new ListNode(val, head.next);
head.next = newNode;
size++;
}
public void addAtTail(int val) {
ListNode curr = head;
while (curr.next != null) { // 遍历到最后一个节点
curr = curr.next;
}
curr.next = new ListNode(val);
size++;
}
public void addAtIndex(int index, int val) {
if (index < 0 || index > size) return;
if (index == 0) {
addAtHead(val);
return;
}
if (index == size) {
addAtTail(val);
return;
}
ListNode prev = head;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
prev.next = new ListNode(val, prev.next);
size++;
}
public void deleteAtIndex(int index) {
if (index < 0 || index >= size) return;
ListNode prev = head;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
prev.next = prev.next.next;
size--;
}
}
theme: smartblue
206.反转链表
状态:第三次卡壳了,要用双指针,定义一个prev和一个curr,这个题不适合虚拟头节点
思路
注意:双指针或递归都可以,不要用虚拟头节点,prev定义成null
代码
时间复杂度:O(n)
空间复杂度:O(1)
java
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode temp = curr.next;
curr.next = prev;
prev = curr;
curr = temp;
}
return prev;
}
}