代码随想录算法训练营第三天
今日目标:
203.移除链表元素
707.设计链表
206.反转链表
代码随想录
203.移除链表元素
题意:删除链表中等于给定值 val 的所有节点。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
思路:哇,我竟然手写出来了(我哭死),直接想到了设置虚拟节点,自己手写了一遍代码,编译器没有通过,发现是循环结束条件写成了q.next!=null;找到bug之后就通过了。
一定要注意,设置虚拟节点之后,返回的是headNode.next呀
//设置虚拟节点
public ListNode removeElements(ListNode head, int val) {
if(head==null) return head;
ListNode headNode = new ListNode(0);
headNode.next = head;
ListNode p = headNode;
ListNode q = p.next;
while(p.next!=null){
if(q.val!=val){
p=q;
q=q.next;
}else {
p.next=q.next;
q=p.next;
}
}
return headNode.next;
}
//不虚拟节点
public ListNode removeElementsA(ListNode head, int val) {
while(head!=null && head.val==val){
head=head.next;
}
if(head==null) return head;
//这里第一个节点一定不==val
ListNode p = head;
ListNode q = p.next;
while(p.next!=null){
if(q.val!=val){
p=q;
q=q.next;
}else{
p.next=q.next;
q=p.next;
}
}
return head;
}
707.设计链表
啊啊啊啊啊啊 真的会被气死,谁家好人小bug找这么长时间,
前边 已经新建一个 head,到底是谁又 new!!! head = new ListNode(0);
public class MyLinkedList extends ListNode {
int size;
ListNode head;
public MyLinkedList(){
int size = 0;
// 不要再 ListNode head 了!!!
head = new ListNode(0);
}
public void addAtHead(int val) {
ListNode p = head;
ListNode q = new ListNode(val);
q.next = p.next;
p.next = q;
size++;
}
public void addAtTail(int val) {
ListNode p = head;
ListNode q = p.next;
while(p.next!=null){
p=p.next;
}
p.next = new ListNode(val);
p.next.next = null;
size++;
}
public void addAtIndex(int index, int val) {
if(index>size){
return;
}
if(index<0){
index = 0;
}
ListNode p = head;
for(int i = 0;i<index;i++){
p=p.next;
}
ListNode q = new ListNode(val);
q.next = p.next;
p.next = q;
size++;
}
public int get(int index) {
if(index<0 || index >=size){
return -1;
}
ListNode p = head;
for(int i = 1;i<=index+1;i++){
p=p.next;
}
return p.val;
}
public void deleteAtIndex(int index) {
ListNode p = head;
if(index< 0 || index>=size){
return;
}
size--;
if(index==0){
head = head.next;
return;
}
for(int i =0;i<index;i++){
p = p.next;
}
p.next=p.next.next;
}
}
206.反转链表
今天时间来不及惹,没有好好思考这道题,(明天补上)
public ListNode reverseList(ListNode head) {
if(head==null){
return head;
}
ListNode prev = null;
ListNode cur = head;
ListNode temp = null;
while(cur!=null){
temp = cur.next;
cur.next=prev;
prev=cur;
cur = temp;
}
return prev;
}