训练营第三天,今天考察的是链表的基础知识,相对来说比较简单
203.移除链表元素
题解及想法
通过遍历链表,定义一个指针指向当前节点的上一个节点,当找到目标节点,通过该节点的上一个指针指向目标节点的下一个节点 ,实现移除链表元素。
/**
* Definition for singly-linked list.
* public 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 Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null){
return head;
}
ListNode h = new ListNode(0); //设置虚拟头节点
h.next = head;
ListNode pre = h;
ListNode p = h.next;
while(p != null){
if(p.val == val){
p = p.next;
pre.next = p;
}else{
pre = pre.next;
p = p.next;
}
}
return h.next;
}
}
707.设计链表
题解及想法
本题考察的是链表的基本结构熟悉程度,没什么好说的
class ListNode {
int val;
ListNode next;
ListNode(){}
ListNode(int val){
this.val = val;
}
}
class MyLinkedList {
//size存储链表元素的个数
int size;
//虚拟头结点
ListNode head;
//初始化
public MyLinkedList() {
size = 0;
head = new ListNode(0);
}
//获取第index个节点的数值,注意index是从0开始的,第0个节点就是头结点
public int get(int index) {
if(index < 0 || index >= size){
return -1;
}
ListNode p = head;
for(int i = 0; i <= index; i++){
p = p.next;
}
return p.val;
}
//在链表最前面插入一个节点,等价于在第0个元素前添加
public void addAtHead(int val) {
addAtIndex(0,val);
}
//在链表的最后插入一个节点,等价于在(末尾+1)个元素前添加
public void addAtTail(int val) {
addAtIndex(size,val);
}
// 在第 index 个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
// 如果 index 等于链表的长度,则说明是新插入的节点为链表的尾结点
// 如果 index 大于链表的长度,则返回空
public void addAtIndex(int index, int val) {
if (index > size) {
return;
}
if (index < 0) {
index = 0;
}
size++;
ListNode p = head;
for(int i = 0; i < index; i++){
p = p.next;
}
ListNode newNode = new ListNode();
newNode.val = val;
newNode.next = p.next;
p.next = newNode;
}
//删除第index个节点
public void deleteAtIndex(int index) {
if(index < 0 || index >= size){
return;
}
size--;
if(index == 0){
head = head.next;
return;
}
ListNode p = head;
for(int i = 0; i < index; i++){
p = p.next;
}
p.next = p.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.反转链表
题解及想法
/**
* Definition for singly-linked list.
* public 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 Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode p = head;
ListNode q; //中间过度指针
while(p != null){
q = p.next;
p.next = pre;
pre = p;
p = q;
}
return pre;
}
}