14:09- 15:10 共计1h
203. 移除链表元素 16:10min
不难,使用的是不带虚拟头结点的方法,
1. 忘记判断head是否为null
2. 忘记写第一个while循环,没有处理好头结点。
代码如下:
class Solution {
public ListNode removeElements(ListNode head, int val) {
while (head != null && head.val == val) {
head = head.next;
}
if (head == null)
return head;
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
if (cur.val == val) {
pre.next = cur.next;
} else {
pre = cur;
}
cur = cur.next;
}
return head;
}
}
带头结点的方式:
707. 设计链表 8:16min
犯了很多小错误
- 参考了一下单链表的结构。
- 忽略了非法情况
- 删除和添加的边界情况
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
}
class MyLinkedList {
// size存储链表元素的个数
int size;
// 虚拟头结点
ListNode head;
public MyLinkedList() {
size = 0;
head = new ListNode(0);
}
public int get(int index) {
// 如果index非法,返回-1
if (index < 0 || index >= size) {
return -1;
}
ListNode temp = head;
// 包含一个虚拟头节点,所以查找第 index+1 个节点
for (int i = 0; i <= index; i++) {
temp = temp.next;
}
return temp.val;
}
public void addAtHead(int val) {
ListNode temp = new ListNode(val);
temp.next = head.next;
head.next = temp;
size++;
}
public void addAtTail(int val) {
ListNode temp = new ListNode(val);
ListNode t = head;
for (int i = 0; i < size; i++)
t = t.next;
t.next = temp;
size++;
}
public void addAtIndex(int index, int val) {
if (index == size)
addAtTail(val);
else if (index >= 0 && index < size) {
ListNode pre = head;
for (int i = 0; i < index; i++) {
pre = pre.next;
}
ListNode temp = new ListNode(val);
temp.next = pre.next;
pre.next = temp;
size++;
}
}
public void deleteAtIndex(int index) {
if (index >= 0 && index < size) {
ListNode pre = head;
for (int i = 0; i < index; i++) {
pre = pre.next;
}
ListNode temp = pre.next.next;
pre.next = temp;
size--;
}
}
}
206. 反转链表 4:16min
前段时间刚写过,使用的是双指针的写法。
这次使用的是递归的方法。
class Solution {
public ListNode reverseList(ListNode head) {
return reverse(null,head);
}
public ListNode reverse(ListNode pre,ListNode cur){
if(cur==null) return pre;
ListNode temp=cur.next;
cur.next=pre;
return reverse(cur,temp);
}
}