(开始为了秋招做一点记录吧,不然就摆了)
1. 移除链表元素
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public ListNode removeElements(ListNode head, int val) { ListNode dummyNode = new ListNode(0); dummyNode.next = head; ListNode cur = head; ListNode pre = dummyNode; while(cur != null) { if(cur.val == val) { pre.next = cur.next; cur = pre.next; }else { pre = pre.next; cur = cur.next; } } return dummyNode.next; } }
|
2. 设计链表
你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针 / 引用。
如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList 类:
- 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 的节点。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 输入 ["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"] [[], [1], [3], [1, 2], [1], [1], [1]] 输出 [null, null, null, null, 2, null, 3]
解释 MyLinkedList myLinkedList = new MyLinkedList(); myLinkedList.addAtHead(1); myLinkedList.addAtTail(3); myLinkedList.addAtIndex(1, 2); myLinkedList.get(1); myLinkedList.deleteAtIndex(1); myLinkedList.get(1);
|
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
class MyLinkedList { int size;
ListNode head;
public MyLinkedList() { size = 0; head = new ListNode(0); } public int get(int index) { if(index < 0 || index >= size) { return -1; }
ListNode node = head; for(int i = 0; i <= index; i++) { node = node.next; } return node.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; } ListNode cur = head.next; ListNode pre = head; ListNode node = new ListNode(val);
while(index-- > 0) { cur = cur.next; pre = pre.next; }
pre.next = node; node.next = cur; size++; } public void deleteAtIndex(int index) { if(index < 0 || index >= size) { return; } ListNode cur = head.next; ListNode pre = head;
while(index-- > 0) { cur = cur.next; pre = pre.next; }
pre.next = cur.next; size--; } }
|