本次题目
203 移除链表元素
707 设计链表
203 移除链表元素
注意:删除头结点和删除其他结点的操作不同。可以设置一个虚拟头结点再进行删除。虚拟头结点指向的下一个结点为原来的头结点,因此最后返回的头结点也是虚拟头结点指向的下一个结点;定义当前位置和指向当前位置的指针,while循环判断当前结点的值是否要删除。
class Solution {
public ListNode removeElements(ListNode head, int val) {
//当链表为空时直接返回头结点
if(head == null){
return head;
}
//设置虚拟头结点
ListNode virtualHead = new ListNode(0, head);
//开始判断
ListNode front = virtualHead;
ListNode now = head;
while(now != null){
if(now.val == val){
front.next = now.next;
}else{
front = now;
}
now = now.next;
}
return virtualHead.next;
}
}
707 设计链表
注意:下标index从0开始,链表长度为size,因此下标的合法范围为[0,size-1]。可以设置一个虚拟头结点进行操作,遍历时要注意当前指向的位置:输出第index个值时指向的就是当前节点,因此遍历时i可以等于index;插入和删除都是需要指向前一个节点,遍历时i不能等于index,否则就插入删除到index+1位置的节点了。
class ListNode{
//属性
int val;
ListNode next;
//构造器
ListNode(){}
ListNode(int val){
this.val = val;
}
ListNode(int val, ListNode next){
this.val = val;
this.next = next;
}
}
class MyLinkedList {
//长度属性
int size;
//虚拟头节点
ListNode head;
//初始化
public MyLinkedList() {
size = 0;
head = new ListNode(0);
}
//获取链表第index个节点的值
public int get(int index) {
//如果索引无效,则返回-1
if(index<0 || index >= size){
return -1;
}
//从虚拟头节点开始
ListNode cur = head;
//i=index时输出的就是第index个值
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) {
//如果index大于链表长度,不插入
if(index > size){
return;
}
//如果index小于0,在头部插入
if(index < 0){
index = 0;
}
//从虚拟头节点开始
ListNode cur = head;
//i=index-1时就是插入到第index位置前
for(int i = 0; i < index; i++){
cur = cur.next;
}
//开始插入
ListNode addNode = new ListNode(val);
addNode.next = cur.next;
cur.next = addNode;
//长度改变
size++;
}
public void deleteAtIndex(int index) {
//如果index无效,不删除
if(index < 0 || index >= size){
return;
}
//从虚拟头节点开始
ListNode cur = head;
//i=index-1时就是指向第index个位置的指针
for(int i = 0; i < index; i++){
cur = cur.next;
}
//开始删除
cur.next = cur.next.next;
//长度改变
size--;
}
}