算法篇:链表Linked List
文章目录
知识
插入、删除:O(1)时间
双链表的结构性开销是单链表的两倍,prev、insert、delete:O(1)
数组与链表的区别:
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) {
//在最前面增加一个链结点
ListNode addition = new ListNode(0);
addition.next = head;
ListNode current = addition;
while(current.next != null){
if(current.next.val == val){
current.next = current.next.next;
}else {
current =current.next;
}
}
return addition.next;
}
}
206.反转链表
思路:存在迭代和递归两种解法
迭代:利用pre、curr、next三个指针迭代翻转
class Solution {
public ListNode reverseList(ListNode head) {
//迭代法
ListNode prev = null;
ListNode curr = head;
ListNode next = null;
if(head == null) return head;
while(curr != null){
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
head = prev;
return head;
}
}
递归:
class Solution {
public ListNode reverseList(ListNode head) {
//递归中止条件
if(head == null || head.next == null){
return head;
}
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
}