L0707 设计链表
个人感觉这一题比较重要,深刻理解链表。
注意最值得思考和注意的点是对于链表中第几个
这种问题,需要确定好虚拟头节点的index在自己的代码中是0
还是-1
。
class MyLinkedList {
int size;
ListNode head; //是虚拟头结点 这里认为其index是-1
public MyLinkedList() {
size = 0;
head = new ListNode(-1);
}
public int get(int index) {
if (index < 0 || index > size - 1) {
return -1;
}
ListNode pointer = head;
for (int i = 0; i <=index; i++) {
pointer = pointer.next;
}
return pointer.val;
}
public void addAtIndex(int index, int val) {
if (index < 0 || index > size) {
return;
}
ListNode pre = head;
// 0 1 2 3 4 5
for (int i = 0; i <index; i++) {
pre = pre.next;
}
pre.next = new ListNode(val, pre.next);
size++;
}
public void deleteAtIndex(int index) {
if (index < 0 || index >= size) {
return;
}
// -1 0 1 2 3 4 5
ListNode pre = head;
for (int i = 0; i <index; i++) {
pre = pre.next;
}
pre.next = pre.next.next;
size--;
}
public void addAtHead(int val) {
addAtIndex(0,val);
}
public void addAtTail(int val) {
addAtIndex(size,val);
}
}
L206 反转链表
同样是这种模拟题目,需要的注意
- 指针断开和连接的逻辑
- cur到底是哪个节点
- 什么时候结束while循环
题目其实没什么好说的,标一个错误答案 ↓
这样写会导致链表成环
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) return head;
ListNode slow = head;
ListNode fast = head.next;
while(fast != null){
ListNode temp = fast.next;
fast.next = slow;
slow = fast;
fast =temp;
}
return slow;
}
是因为从左边到右边的时候,其实存在着①→②这个结构。
因为原先的头结点变成了尾节点,而尾节点.next = null,因此可以在初始化完成后手动将将要成为尾节点的头结点指向空。