day3:
707不会,自己看了很久的答案
203.力扣题目链接
比较基础,注意一点:dummy用于最后追踪返回头结点,不能随意变动。
class Solution {
public ListNode removeElements(ListNode head, int val) {
//设立一个虚拟头结点
ListNode dummy = new ListNode(-1,head);
if(head == null){
return head;
}
//dummy用于最后追踪返回头结点,不能随意变动
ListNode pre = dummy;
ListNode cur = head;
while(cur!=null){
if(cur.val == val){
pre.next = cur.next;
}
else{
pre = cur;
}
cur = cur.next;
}
return dummy.next;
// while(head!=null&&head.val == val){
// head = head.next;
// }
// if(head == null){
// return head;
// }
// ListNode pre = head;
// ListNode cur = head.next;
// while(cur != null){
// if(cur.val == val){
// pre.next = cur.next;
// }
// else{
// pre = cur;
// }
// cur = cur.next;
// }
// return head;
}
}
707.不会做,感觉非常的晕,还需要消化
class LinkNode{
int val;
LinkNode next;
public LinkNode(){};
public LinkNode(int val){
this.val = val;
}
}
class MyLinkedList {
int size;
LinkNode dummy;
public MyLinkedList() {
//初始化,定义一个虚拟头结点,同时size还保持为0;
也就是之后的头节点的index为0,size为1,符合题目要求。
size = 0;
dummy = new LinkNode(0);
}
public int get(int index) {
//举极端例子,只有一个结点时,index为0,size为1,所以应该是>=
if(index < 0 || index >= size){
return -1;
}
LinkNode cur = dummy.next;
while(index > 0){
//同样举极端例子,当要取的index为0时,不进行移动的操作。
cur = cur.next;
index--;
}
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 ++;
LinkNode cur = dummy;
LinkNode node = new LinkNode(val);
while(index>0){
cur = cur.next;
index--;
}
node.next = cur.next;
cur.next = node;
}
public void deleteAtIndex(int index) {
if(index < 0 || index >= size){
return;
}
size--;
LinkNode cur = dummy;
while(index > 0){
cur = cur.next;
index--;
}
cur.next = cur.next.next;
}
}
/**
* 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);
*/
206.这个题的重点是,在cur反向next连接pre时,为了不跟丢原来的链表,需要临时建一个temp指针。同样的,为了pre能够移动,prev = cur;cur = temp;的先后顺序不能改变。
class Solution {
public ListNode reverseList(ListNode head) {
return reverse(null, head);
}
private ListNode reverse(ListNode prev, ListNode cur) {
if (cur == null) {
return prev;
}
ListNode temp = null;
temp = cur.next;// 先保存下一个节点
cur.next = prev;// 反转
// 更新prev、cur位置
// prev = cur;
// cur = temp;
return reverse(cur, temp);
}
}