package SecondBrush.LinkedList.LL1;
/**
* 203.移除链表元素
* 删除链表中等于给定值 val 的所有节点。
* 自己再次概述一下这个过程:
* 1.移除元素,要采用设置虚拟节点的方式,因为那样不需要考虑头结点问题
* 2.设置两个虚拟指向
* 3.移除元素就是遍历链表,然后碰到 目标值,就直接跨过目标值
* */
public class RemoveLinkedListElements_203 {
public ListNode remove(ListNode head,int val){
if (head == null) {
return head;
}
ListNode dummyhead = new ListNode(-1,head);
ListNode pred = dummyhead;
ListNode cur = head;
while (cur != null){
if (cur.val == val){
pred.next = cur.next;
}else {
pred = cur;
}
cur = cur.next;
}
return dummyhead.next;
}
}
package SecondBrush.LinkedList.LL1;
/**
* 707. 设计链表
* MyLinkedList() 初始化 MyLinkedList 对象。
* int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
* void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
* void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
* void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
* void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。
*
*
* 自己再概述一下思路:
* 这是一个考察链表的好题目:
* 拿到下标元素,首先要考虑边界问题,然后遍历 取值
*/
/**
* 还是有迷惑的点,就是index边界问题,想不明白
*
* */
public class DesignLinkedList_707 {
}
class MyLinkedList1{
int size;
ListNode head;
// 初始化
public void MyLinkedList(){
size = 0;
head = new ListNode(0);
}
public int get(int index){
if (index <0 || index >= size){
return -1;
}
ListNode cur = head;
for (int i = 0; i <= index; i++) { // 能勉强写出来,但是边界感不清楚,为什么包含index
// 瞬间想明白了,因为我们加了一下虚拟节点,所以虽然取值 index的,但是实际是 index+1
cur = cur.next;
}
return cur.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;
}
// 删除元素
public void deleteAtIndex(int index){
if (index <0 || index>=size){
return;
}
size--;
if (index == 0){
head = head.next;
}
ListNode pred = head;
for (int i = 0; i < index; i++) {
pred = pred.next;
}
pred.next = pred.next.next;
}
}
package SecondBrush.LinkedList.LL1;
/**
* 206.反转链表
*
* */
public class ReverseLinkedList_206 {
public ListNode reverseList(ListNode head){
ListNode prev = null;
ListNode temp = null;
ListNode cur = head;
while (cur != null){
temp = cur.next;
cur.next = prev;
prev = cur;
cur = temp;
}
return prev;
}
}