目录
1.3.1InsertAtEnd - 在链表的末尾插入指定元素
1.3.2InsertAtHead - 在链接列表的开头/头部插入指定元素
1.3.3Delete - 从链接列表中删除指定元素(指定位置)
1.3.4Delete - 从链接列表中删除指定元素Node
2.2.1平衡二叉树Balanced Binary Tree
1.链表
链表是另一个重要的线性数据结构,乍一看可能有点像数组,但在内存分配、内部结构以及数据插入和删除的基本操作方面均有所不同。
链表就像一个节点链,其中每个节点包含着数据和指向后续节点的指针。 链表还包含一个头指针,它指向链表的第一个元素,但当列表为空时,它指向null或无具体内容。
1.1单链表
单链表包含内容和下一个元素的指针;
单链表结构图:
单链表类定义:
class Node{
int val; //节点元素(内容)
Node next; //指向下一节点的引用
public Node(int val){
this.val = val;
}
}
1.2双链表
双链表包含内容,上一个元素指针和下一个元素的指针;包含单链表内容和下一个指针,多了上一个元素指针;
双链表结构图:
双链表类定义:
class Node{
int val; //节点元素(内容)
Node pre; //指向上一个节点引用
Node next; //指向下一节点的引用
public Node(int val){
this.val = val;
}
}
1.3单链表常见操作
//链表
public class LinkNode {
Node head; //头
// Node last;
/**
* 节点,包含节点元素(内容)和指向下一节点的引用
*/
static class Node{
int val; //节点元素(内容)
Node next; //指向下一节点的引用
public Node(int val){
this.val = val;
}
}
}
1.3.1InsertAtEnd - 在链表的末尾插入指定元素
//在链表的末尾插入指定元素
public void addNode(int d){
Node node = new Node(d);
if(head == null){
head = node;
return;
}
Node tmp = head;
while (tmp.next != null){
tmp = tmp.next;
}
tmp.next = node;
}
1.3.2InsertAtHead - 在链接列表的开头/头部插入指定元素
//在链接列表的开头/头部插入指定元素
public void addHeadNode(int d){
Node node = new Node(d);
if(head == null){
head = node;
return;
}
node.next = head;
head = node;
}
1.3.3Delete - 从链接列表中删除指定元素(指定位置)
/**
* 从链表删除第index(0-based)个位置的元素 ,返回删除结果 (实际不常用,练习用)
* @param index
* @return
*/
public boolean deleteIndexNode(int index){
if(index<0 || index>=length()){
return false;
}
if(index == 0){
head = head.next;
}else {
Node pre = head;
for(int i=1; i<index; i++){
pre = pre.next; //获取删除节点的前一个节点
}
Node temp = pre.next; //保留要删除节点
pre.next = temp.next; //删除节点的next赋值给删除节点的前一个节点next
temp.next = null; //删除节点next设置为null
}
return true;
}
1.3.4Delete - 从链接列表中删除指定元素Node
/**
* 删除指定节点
* @param node
* @return
*/
public boolean deleteNode(Node node){
if(node == null || head == null){
return false;
}
//不是最后一个节点
if(node.next != null){
Node q = node.next;
node.val = q.val;
node.next = q.next;
return true;
}else {
//最后节点
Node temp = head;
while (temp.next != null){
if(temp.next == node){
temp.next = node.next;
return true;
}
temp = temp.next;
}
}
return false;
}
1.3.5链表基础操作获取链表长度,是否链表为空等
//链表长度
public int length(){
if(head == null){
return 0;
}
int length = 1;
Node tmp = head;
while (tmp.next != null){
length++;
tmp = tmp.next;
}
return length;
}
public Node getHead(){
return head;
}
/**
* 判断链表是否为空
* @return
*/
public boolean isEmpty(){
return head == null;
}
/**
* 打印节点
*/
public void printListNode(){
Node temp = head;
while (temp != null){
System.out.println(temp.val);