203移除链表元素
学习如何创建虚拟头节点,更改指针指向的时候先判断这个节点是不是null,还要仔细斟酌当cur.val==val的时候是pre的next指向cur的next,这里不能把pre写成cur.next,这样的话pre也没改。
当cur.val!=val的时候,就往后移动,cur就是下一个pre
以上是更新下一组查询中前一个结点的操作,
最后还要更新新的cur的值==cur.next
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null){
return head;
}
ListNode dummy = new ListNode(-1,head);
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;
}
}
尚未掌握,还需回顾
首先需要定义链表的类,提供val与next,提供有参无参的构造器
初始化链表要在下面的类里面要定义链表长度,并声明一个head
getval就是构造虚拟头节点,然后for循环过去到index那个节点上,最后输出该节点的val
添加节点方法要先判断index是否在size内,如果不在就直接return,如果在就是先size++,然后用一个虚拟节点listnode dummy = head,用for移动到该index位置上面去,然后new一个新节点括号里面填val的值,然后进行替换
删除节点方法就是先判断是否是合理范围,如果是合理范围则size--,然后用一个虚拟节点listnode dummy = head,用for移动到该index位置上面去,然后直接指向下一个节点即可。
在前面后面添加节点可以直接调用写好的添加节点方法
class ListNode {
int val;
ListNode next;
ListNode(){}
ListNode(int val) {
this.val=val;
}
}
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 cur = head;
for(int i = 0;i<=index;i++){
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 pre = head;
for(int i = 0;i<index;i++){
pre = pre.next;
}
ListNode toadd = new ListNode(val);
toadd.next = pre.next;
pre.next = toadd;
}
public void deleteAtIndex(int index) {
if(index<0 || index >=size){
return;
}
size--;
if(index == 0){
head = head.next;
return;
}
ListNode pre = head;
for(int i = 0;i<index;i++){
pre = pre.next;
}
pre.next = pre.next.next;
}
}
错误代码注意,应该是直接head = new listnode(0)
public MyLinkedList() {
size = 0;
ListNode head = new ListNode(0);
}
比较简单的一题,有思路就好,但是还有递归的方法还没有看
class Solution {
public ListNode reverseList(ListNode 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;
}
}