1. 移除链表元素
题目链接:203. 移除链表元素 - 力扣(LeetCode)
我们直到要删除链表的某一个节点,必须先要找到要删除节点的前一个节点的位置p
,然后让p
指向要删除节点的下一个节点:p.next = p.next.next
本题由于可能要删除头节点,为此我们要建立一个虚拟头节点,使其指向头节点,这样要是删除头节点的话我们也不用特判断!
Code
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode p = dummy;
while(p.next != null){
if(p.next.val == val){
p.next = p.next.next;
}else {
p = p.next;
}
}
return dummy.next;
}
}
2. 翻转链表
思路:双指针,每次枚举两个点,改变指针指向即可
Code
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null) return head;
ListNode a = head;
ListNode b = a.next;
while(b != null){
ListNode c = b.next;
b.next = a;
a = b;
b = c;
}
head.next = null;
return a;
}
}
3. 设计链表
思路:看代码
// 自定义结构体
class ListNode {
int val;
ListNode next;// 后驱节点
ListNode() {}
ListNode(int val){this.val = val;}
}
class MyLinkedList {
int size;
ListNode dummy;
public MyLinkedList() {// 初始化链表
size = 0;
dummy = new ListNode(-1);
}
/*
获取链表中第 index 个节点的值。如果索引无效,则返回-1
*/
public int get(int index) {
if(index < 0 || index >= size){
return -1;
}
ListNode cur = dummy;
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);
}
/*
在链表中的第 index 个节点之前添加值为 val 的节点。
思路:找到要插入位置的前驱
*/
public void addAtIndex(int index, int val) {
if(index > size) {// 大于链表长度直接返回
return ;
}
if(index < 0){// 小于0头插
index = 0;
}
// 链表长度加1
size ++;
// 找到前驱
ListNode pre = dummy;
for(int i = 0; i < index; i ++){
pre = pre.next;
}
// 创建新节点
ListNode AddNewNode = new ListNode(val);
AddNewNode.next = pre.next;// 放前面
pre.next = AddNewNode;
}
/*
如果索引 index 有效,则删除链表中的第 index 个节点
*/
public void deleteAtIndex(int index) {
if(index < 0 || index >= size){
return ;
}
size --;
ListNode pre = dummy;
for(int i = 0; i < index; i ++){
pre = pre.next;
}
pre.next = pre.next.next;
}
}