移除链表元素
题目链接: https://leetcode.cn/problems/remove-linked-list-elements/
思路:
- 主要考虑移除元素后需要让被移除元素前置节点的
next
指向其后置节点, 采用递归法可以很方便的解决. 递归法遍历到末尾后依次将当前头节点
返回给上一层, 如果当前元素是需要被删除的元素则将当前元素的next
节点作为头节点返回.
代码(java):
class Solution {
public ListNode removeElements(ListNode head, int val) {
if (head == null) return null; //递归终止
head.next = removeElements(head.next, val); //替换删除后链表
return head.val != val ? head : head.next; //删除操作
}
}
翻转链表:
思路:
- 递归到链表末尾将链表末尾元素作为
新的头节点
返回, 并在递归返回的过程中进行翻转操作.
注意事项:
- 返回过程中每层递归返回的都是
新的头节点
, 即原链表的末尾元素. - 递归返回过程中, 翻转操作可以通过当前层的
head.next
节点的next
节点指向当前层head
实现. - 每层翻转完成后需要将当前节点的
next
置为null
, 否则会在新链表的末尾形成循环链表.
代码:
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) return head; //保证当前层节点作为头节点的子链表长度>=2, 作为递归终止条件
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}
设计链表:
思路(单向链表):
- 使用一个
Node
类用于记录链表数据,MyLinkedList
只保存链表的头节点, 在MyLinkedList
内维护一个变量size
记录链表长度用于提高链表操作效率.
代码(java):
class MyLinkedList {
Node head;
int size = 0;
public MyLinkedList() {
}
/*根据索引获取元素*/
public int get(int index) {
if (index >= size || size == 0) {
return -1;
}
Node temp = head;
while (index-- > 0) {
temp = temp.next;
}
return temp.val;
}
/*在头部添加元素*/
public void addAtHead(int val) {
this.head = new Node(val, head);
size++;
}
/*在尾部添加元素*/
public void addAtTail(int val) {
if (size == 0) {
addAtHead(val);
return;
}
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = new Node(val, null);
size++;
}
/*在指定索引处添加元素*/
public void addAtIndex(int index, int val) {
if (index > size) {
return;
}
if (index <= 0) {
addAtHead(val);
return;
}
Node temp = head;
while (index-- > 1) {
temp = temp.next;
}
temp.next = new Node(val, temp.next);
size++;
}
/*删除指定索引处元素*/
public void deleteAtIndex(int index) {
if (index < 0 || index >= size) {
return;
}
if (index == 0) {
head = head.next;
} else {
Node temp = head;
while (index-- > 1) {
temp = temp.next;
}
temp.next = temp.next.next;
}
size--;
}
}
static class Node {
int val;
Node next;
Node() {}
Node(int val, Node next) {
this.val = val;
this.next = next;
}
}
标签:Node,head,val,temp,next,链表,移除,leetcode
From: https://www.cnblogs.com/Ahyi/p/17014810.html