算法学习day03链表part01-203、707、206
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; } }
分类:
算法2刷
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能