链接列表插入删除方法
链接列表插入方法使我们可以在特定位置插入Node。
根据插入新节点的位置,有三种插入方法。
- addLast
- addFirst
- addAt
链接列表插入方法
顾名思义,新节点将附加在"链接"列表的最后一个位置。
链接列表的大小增加1。
" tail"指向新添加的Node。
由于我们有尾节点,因此时间复杂度为O(1),否则为O(n)。
1. addLast
新节点将添加到"链接"列表的第一个位置。
链接列表的大小增加1。
" head"指向新添加的Node。
由于不涉及List的遍历,因此时间复杂度为O(1)。
2. addFirst
此方法有两个参数-要插入的Node和一个整数索引(例如" k")。
该节点将添加到"链接"列表的第k个位置。
链接列表的大小增加1。
如果要添加的元素是" First"或者" Last",则分别调用" addFirst"或者" addLast"。
在此操作中,我们还使用另一个函数" getNodeAt",它是我们的链接列表类的私有成员。
此函数将整数索引作为参数,如果索引有效(即,如果index> = 0且index <链接列表的大小),则它将返回该索引处的Node。
因此,在此功能中,需要遍历链接列表。
addAt()函数的时间复杂度为O(n)。
3. addAt
链接列表删除
链表支持三种删除节点的方法。
- removeLast
- removeFirst
- removeAt
链接列表删除方法
此方法删除链接列表的最后一个元素(提供的列表不是一个空列表,它会引发异常)。
它将"尾巴"移动到最后一个第二个元素(如果有的话),并将大小减小" 1"。
同样,它返回删除的数据。
由于我们有尾节点,因此时间复杂度为O(1),否则为O(n)。
1.删除最后
它将删除"链接"列表的第一个元素(如果列表不是空列表,则其中引发异常)。
此方法将" head"移至第二个元素(如果有的话),并将大小减小" 1"。
同样,它返回删除的数据。
由于不涉及List的遍历,因此时间复杂度为O(1)。
2. removeFirst
它使用一个整数索引(假设为k)作为参数,如果索引有效,它将删除"链接"列表的" kth"元素并将其大小减小" 1"。
同样,它返回删除的数据。
如果要删除的元素是" First"或者" Last",则分别调用" removeFirst"或者" removeLast"。
在此操作中,我们还使用另一个函数" getNodeAt",它是链接列表类的私有成员。
此函数将整数索引作为参数,如果索引有效(即,如果index> = 0且index <链接列表的大小),则它将返回该索引处的Node。
因此,在该函数中,需要遍历列表,因此,它是O(n),这会使操作" removeAt"的时间复杂度变为O(n)。
3. removeAt
package com.theitroad.ds; public class LinkedList1 { private class Node { int data; Node next; } private Node head; private Node tail; private int size; public int size() { return this.size; } public int getFirst() throws Exception { if (this.size == 0) { throw new Exception("LL is Empty."); } return this.head.data; } public int getLast() throws Exception { if (this.size == 0) { throw new Exception("LL is Empty."); } return this.tail.data; } public int getAt(int idx) throws Exception { if (this.size == 0) { throw new Exception("LL is Empty."); } if (idx < 0 || idx >= this.size) { throw new Exception("Invalid Index."); } Node temp = this.head; for (int i = 1; i <= idx; i++) { temp = temp.next; } return temp.data; } private Node getNodeAt(int idx) throws Exception { if (this.size == 0) { throw new Exception("LL is Empty."); } if (idx < 0 || idx >= this.size) { throw new Exception("Invalid Index."); } Node temp = this.head; for (int i = 1; i <= idx; i++) { temp = temp.next; } return temp; } public void addLast(int item) { //create Node nn = new Node(); nn.data = item; nn.next = null; //attach if (this.size > 0) this.tail.next = nn; //dm update if (this.size == 0) { this.head = nn; this.tail = nn; this.size += 1; } else { this.tail = nn; this.size += 1; } } public void addFirst(int item) { //create Node nn = new Node(); nn.data = item; nn.next = null; //attach nn.next = this.head; //dm update if (this.size == 0) { this.head = nn; this.tail = nn; this.size++; } else { this.head = nn; this.size++; } } public void addAt(int item, int idx) throws Exception { if (idx < 0 || idx > this.size) { throw new Exception("Invalid Index."); } if (idx == 0) { addFirst(item); } else if (idx == this.size) { addLast(item); } else { //create Node nn = new Node(); nn.data = item; nn.next = null; //attach Node nm1 = getNodeAt(idx - 1); Node np1 = nm1.next; nm1.next = nn; nn.next = np1; //dm this.size++; } } public int removeFirst() throws Exception { if (this.size == 0) { throw new Exception("LL is empty."); } Node temp = this.head; if (this.size == 1) { this.head = null; this.tail = null; this.size = 0; } else { this.head = this.head.next; this.size--; } return temp.data; } public int removeLast() throws Exception { if (this.size == 0) { throw new Exception("LL is empty."); } Node temp = this.tail; if (this.size == 1) { this.head = null; this.tail = null; this.size = 0; } else { Node sm2 = getNodeAt(this.size - 2); sm2.next = null; this.tail = sm2; this.size--; } return temp.data; } public int removeAt(int idx) throws Exception { if (this.size == 0) { throw new Exception("LL is empty."); } if (idx < 0 || idx >= this.size) { throw new Exception("Invalid Index."); } if (idx == 0) { return removeFirst(); } else if (idx == this.size - 1) { return removeLast(); } else { Node nm1 = getNodeAt(idx - 1); Node n = nm1.next; Node np1 = n.next; nm1.next = np1; this.size--; return n.data; } } public void display() { System.out.println("----------------------"); Node temp = this.head; while (temp != null) { System.out.print(temp.data + " "); temp = temp.next; } System.out.println("."); System.out.println("----------------------"); } public static void main(String[] args) throws Exception { LinkedList1 list = new LinkedList1(); list.addLast(10); list.addLast(20); list.addLast(30); list.addLast(40); //this will display the list list.display(); //10 should be removed and printed System.out.println(list.removeFirst()); list.display(); //40 should be removed and printed System.out.println(list.removeLast()); list.display(); //list without 10 and 40 should be printed list.display(); //100 should be added at first list.addFirst(100); list.display(); //30 should be removed list.removeAt(2); list.display(); //300 should be added at 2nd index list.addAt(300, 2); list.display(); } }