题目
思路
因为在链表中删除头节点和其他节点的操作是不同的,因此如果直接进行遍历删除则需要区分操作。但是可以通过使用虚拟头节点,这样原始头节点也是能和其他节点进行一样的操作。
代码
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode head_nll = new ListNode();
head_nll.next = head; //虚拟头节点
ListNode p = head;
ListNode q = head_nll;//记录p的前一个节点
while (p != null) {
if (p.val == val) {// 当前节点的值==val 需要删除该节点
q.next = p.next;
p = p.next;
} else {
q = p;//不需要删除节点时,前指针q向后移
p = p.next;
}
}
return head_nll.next; // 返回实际头节点
}
}
题目
思路
首先就是不知道MyLinkedList有哪些属性,对于插入头节点和在固定下标插入节点,没有想到插入头节点==在下标为0的地方插入节点。自己写的代码有点点乱,建议看这个:代码随想录
代码
class MyLinkedList {
int size;
ListNode head;
public MyLinkedList() { //
size = 0;
head = new ListNode(0); // 虚拟头节点
}
public int get(int index) {
ListNode p = this.head.next; //从实际头节点开始算
if (index < 0 || index >= size){
return -1;
}
while(index > 0){ //
p = p.next;
index -= 1;
}
return p.val;
}
public void addAtHead(int val) {
ListNode new_node = new ListNode(val);
new_node.next = this.head.next;
this.head.next = new_node;
this.size += 1;
}
public void addAtTail(int val) {
ListNode p = this.head;
while(p.next != null){
p = p.next;
}
ListNode new_node = new ListNode(val);
p.next = new_node;
this.size += 1;
}
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) {
ListNode p = this.head.next;
ListNode q = this.head;
if(index < 0 || index >= size){
return;
}
while(index > 0){
q = p;
p = p.next;
index -= 1;
}
q.next = p.next;
this.size -= 1;
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/