1. 移除链表元素
题目链接:203.移除链表元素
1.看到这道题目的第一想法是比较简单,遍历链表找到节点val值等于target的节点,然后删除,即当前节点的上一个节点指向当前节点的下一个节点,所以要定义一个pre指向head,一个cur指向head.next,删除的时候只需pre.next = cur.next,然后将当前指针指向下一个节点cur = cur.next;
2.学习视频链接
3.在写代码的过程中总是会出现一些问题,忽略一些细节,比如忽略了头节点的值就等于目标元素的值,头节点为null的情况
code
if (head == null) {
return head;
}
// 定义一个虚拟头节点
ListNode dummy = new ListNode(0, head);
ListNode pre = dummy;
ListNode cur = head;
while (cur != null) {
if (cur.val == val) {
pre.next = cur.next;
}
else {
// 把pre指向cur
pre = cur;
}
cur = cur.next;
}
return dummy.next;
}
4.学习感悟:在删除节点的过程中,要考虑到头节点被删除的情况,所以可以使用定义一个虚拟头节点的方法;定义了一个pre和cur,再删除了当前元素后,pre指针不用移动,cur要指向cur.next,如果当前元素没被删除,那么pre要指向pre.next 即pre=cur,同时cur=cur.next
2. 设计链表
题目链接:707.设计链表
1.设计链表,看到题目的第一想法是设计一个链表(单链表或者双链表)并实现链表中的一些方法,有一些思路,但是不知道具体该怎么实现
2.学习视频链接
code
// 定义一个size用途存储链表元素个数
int size;
// 定义一个虚拟头节点
ListNode head;
// 初始化链表
public MyLinkedList() {
size = 0;
head = new ListNode(0);
}
// 获取第index个节点的值
public int get(int index) {
if (index < 0 || index > size -1) {
return -1;
}
ListNode curNode = head;
// 从头节点开始遍历,index为几就循环多少次
for (int i = 0; i <= index; i++) {
curNode = curNode.next;
}
return curNode.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,即插入在头节点前index = 0
if (index < 0) {
index = 0;
}
// 插入新的节点链表长度增加
size++;
// 找到要插入节点的前驱节点
ListNode pre = head;
// 循环遍历找到index的节点
for (int i = 0; i < index; i++) {
pre = pre.next;
}
// 定义要插入的节点
ListNode newNode = new ListNode(val);
// 插入新节点
newNode.next = pre.next;
pre.next = newNode;
}
public void deleteAtIndex(int index) {
if (index >= size || index < 0) {
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;
}
4.学习感悟:看到最后的提交记录我才发现已经是二刷了,但是写的时候却不知道怎么写,首先在构建MyLinkedList的时候,要定义一个size属性,添加和删除都是一些基本的操作,要利用好虚拟节点。
3. 反转链表
题目链接:206.反转链表
1.看到这道题目的第一想法是这道题我记得我写过,利用递归解题,要反转整个链表,就先反转前n个节点
2.学习视频链接
3.迭代法,每个节点指向前一个节点,然后pre和cur向后移
code
ListNode pre = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;