LinkedList 简介
- LinkedList实现了List接口
- LinkedList的底层使用了双向链表
- LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
- LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
- LinkedList比较适合任意位置插入的场景
单向链表的实现与相关OJ题目
package MySingLeList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class MySingleList {
class ListNode {
public int val;
public ListNode next;
public ListNode(int val) {
this.val = val;
}
}
public ListNode head;
public ListNode creatLink() {
ListNode listNode0 = new ListNode(3);
ListNode listNode1 = new ListNode(5);
ListNode listNode2 = new ListNode(3);
listNode0.next = listNode1;
listNode1.next = listNode2;
head = listNode0;
return head;
}
public void display() {
ListNode cur = head;
while (cur != null) {
System.out.print(cur.val+" ");
cur = cur.next;
}
System.out.println();
}
public void display(ListNode newHead) {
ListNode cur = newHead;
while (cur != null) {
System.out.print(cur.val+" ");
cur = cur.next;
}
System.out.println();
}
public boolean contains(int key) {
ListNode cur = head;
while (cur != null){
if(cur.val == key) {
return true;
}
cur = cur.next;
}
return false;
}
public int size(ListNode head) {
ListNode cur = head;
int cnt = 0;
while (cur != null) {
cnt++;
cur = cur.next;
}
return cnt;
}
public int size() {
ListNode cur = head;
int cnt = 0;
while (cur != null) {
cnt++;
cur = cur.next;
}
return cnt;
}
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int la = size(headA);
int lb = size(headB);
int len = la - lb;
if (len > 0){
while (len >0) {
headA = headA.next;
len--;
}
} else {
while (len < 0){
headB = headB.next;
len++;
}
}
while (headA != headB) {
headA = headA.next;
headB = headB.next;
}
return headA;
}
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if( fast == slow ) {
return true;
}
}
return false;
}
public void addFirst(int data) {
ListNode newHead = new ListNode(data);
newHead.next = head;
head = newHead;
}
public void addLast(int data) {
ListNode newListNode = new ListNode(data);
ListNode cur = head;
if(head == null) {
head = newListNode;
return;
}
while (cur.next != null){
cur = cur.next;
}
cur.next = newListNode;
}
public void addIndex(int index,int data) throws CheckIndexExeption{
ListNode newListNode = new ListNode(data);
checkIndex(index);
if(index == 0) {
addFirst(data);
return;
}
if (index == this.size()) {
addLast(data);
return;
}
try{
ListNode cur = findIndexSunOne(index);
newListNode.next = cur.next;
cur.next = newListNode;
} catch (CheckIndexExeption e){
System.out.println("寄");
}
}
public void remove(int key){
ListNode cur = head;
if (head == null) {
return;
}
if(head.val == key) {
head = head.next;
return;
}
while (cur.next != null) {
if (cur.next.val == key) {
cur.next = cur.next.next;
return;
}
cur = cur.next;
}
System.out.println("没找到捏");
}
public void removeAllKeyN2(int key){
ListNode cur = head;
while (cur != null){
if(cur.val == key){
remove(key);
}
cur = cur.next;
}
}
public static ListNode reverseList(ListNode head){
if(head == null){
return null;
}
if (head.next == null){
return head;
}
ListNode cur = head.next;
head.next = null;
while (cur != null){
ListNode curNext = cur.next;
cur.next = head;
head = cur;
cur = curNext;
}
return head;
}
public ListNode middleNode(ListNode head) {
ListNode cur = head;
ListNode cur2 = head;
int cnt = 0;
int cnt2 = 0;
while (cur != null) {
cnt++;
cur = cur.next;
}
int mid = (cnt/2)+1;
while (cur2 != null) {
if(cnt2 == mid) {
head = cur2;
}
cnt2++;
cur2 = cur2.next;
}
return head;
}
public ListNode middleNode2(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public int kthToLast(ListNode head, int k) {
ListNode slow = head;
ListNode fast = head;
for (int i = 0; i < k-1; i++) {
fast = fast.next;
}
while (fast.next != null){
slow = slow.next;
fast = fast.next;
}
return slow.val;
}
public ListNode mergeTwoLists(ListNode head1, ListNode head2) {
ListNode newhead = new ListNode(0);
ListNode temp = newhead;
while (head1 != null && head2 != null) {
if (head1.val < head2.val) {
temp.next = head1;
head1 = head1.next;
temp = temp.next;
} else {
temp.next = head2;
head2 = head2.next;
temp = temp.next;
}
}
if (head1 != null) {
temp.next = head1;
}
if (head2 != null) {
temp.next = head2;
}
return newhead.next;
}
public boolean isPalindrome(ListNode head) {
if(head == null) {
return false;
}
if(head.next == null) {
return true;
}
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
ListNode cur = slow.next;
while (cur != null) {
ListNode curNext = cur.next;
cur.next = slow;
slow = cur;
cur = curNext;
}
while (slow != head) {
if(head.val != slow.val) {
return false;
}
if(head.next == slow) {
return true;
}
slow = slow.next;
head = head.next;
}
return true;
}
public void removeAllKey(int key) {
if (head == null) {
return;
}
ListNode cur = head.next;
ListNode prev = head;
while (cur != null) {
if (cur.val == key) {
prev.next = cur.next;
cur = cur.next;
} else {
prev = cur;
cur = cur.next;
}
}
if(head.val == key) {
head = head.next;
}
}
public void clear() {
head = null;
}
public ListNode partition(ListNode head, int x) {
ListNode cur = head;
ListNode bs = null;
ListNode be = null;
ListNode as = null;
ListNode ae = null;
while (cur != null){
if(cur.val < x) {
if(bs == null) {
bs = cur;
be = cur;
} else {
be.next = cur;
be = be.next;
}
} else {
if(as == null) {
as = cur;
ae = cur;
} else {
ae.next = cur;
ae = ae.next;
}
}
cur = cur.next;
}
if( bs == null) {
return as;
}
be.next = as;
if( as != null){
ae.next = null;
}
return bs;
}
private ListNode findIndexSunOne(int index) {
ListNode cur = head;
int cnt = 0;
while (cnt != index-1) {
cur = cur.next;
cnt++;
}
return cur;
}
public ListNode reverseBetween (ListNode head, int m, int n) {
if(head == null){
return null;
}
if(head.next == null || (m == 1 && n == 1)){
return head;
}
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode cur = dummyHead;
while (m - 1 > 0){
cur = cur.next;
m--;
}
ListNode prev = cur;
cur = dummyHead;
while (n > 0){
cur = cur.next;
n--;
}
ListNode right = cur;
ListNode last = right.next;
ListNode h1 = prev.next;
ListNode h2 = prev.next;
prev.next = null;
right.next = null;
prev.next = reverseList(h1);
h2.next = last;
return head;
}
private void checkIndex(int index) throws CheckIndexExeption{
if(index<0 || index>this.size()){
throw new CheckIndexExeption("下标不合法");
}
}
}
LinkedList 的实现
package MyLinkedList;
public class myLinkedList {
public ListNode head;
public ListNode last;
static class ListNode{
public int val;
public ListNode prev;
public ListNode next;
public ListNode(int val) {
this.val = val;
}
}
public void creatList() {
ListNode node1 = new ListNode(8);
ListNode node2 = new ListNode(9);
ListNode node3 = new ListNode(55);
ListNode node4 = new ListNode(78);
ListNode node5 = new ListNode(96);
ListNode node6 = new ListNode(3);
ListNode node7 = new ListNode(20);
ListNode node8 = new ListNode(100);
}
public void display() {
ListNode cur = head;
while (cur != null) {
System.out.print(cur.val+" ");
cur = cur.next;
}
System.out.println();
}
public int size() {
ListNode cur = head;
int cnt = 0;
while (cur != null) {
cnt ++;
cur = cur.next;
}
return cnt;
}
public boolean contains(int key) {
ListNode cur = head;
while (cur != null) {
if(cur.val == key){
return true;
}
cur = cur.next;
}
return false;
}
public void addFirst(int data) {
ListNode node = new ListNode(data);
if (head == null){
head = node;
last = node;
} else {
node.next = head;
head.prev = node;
head = node;
}
}
public void addLast(int data) {
ListNode node = new ListNode(data);
if(head == null){
last = node;
head = node;
} else {
last.next = node;
node.prev = last;
last = node;
}
}
public void addIndex(int index, int data) {
if (index<-1 || index>size()){
System.out.println("寄");
return;
}
if ( index == 0 ) {
addFirst(data);
return;
}
if (index == size() ) {
addLast(data);
return;
}
ListNode node = new ListNode(data);
ListNode cur = head;
while (index > 0){
cur = cur.next;
index--;
}
node.next = cur;
cur.prev.next = node;
node.prev = cur.prev;
cur.prev = node;
}
public void remove(int key) {
ListNode cur = head;
while (cur != null) {
if (cur.val == key){
if (cur == head){
head = head.next;
if (head != null){
head.prev = null;
}
} else {
cur.prev.next = cur.next;
if (cur.next != null){
cur.next.prev = cur.prev;
} else {
last = last.prev;
}
}
return;
}
cur = cur.next;
}
}
public void removeAll(int key){
ListNode cur = head;
while (cur != null) {
if (cur.val == key){
if (cur == head){
head = head.next;
if (head != null){
head.prev = null;
}
} else {
cur.prev.next = cur.next;
if (cur.next != null){
cur.next.prev = cur.prev;
} else {
last = last.prev;
}
}
}
cur = cur.next;
}
}
public void clear(){
ListNode cur = head;
while (cur != null){
ListNode curNext = cur.next;
cur.next = null;
cur.prev = null;
cur = curNext;
}
}
}
ArrayList与LinkedList的区别