/**
* 1.1 根据值查询返回节点 findByValue
* 1.2 根据角标查询返回指定的角标的值的节点 findByIndex
* 2.1 链表头部插入 insertToHead
* 2.2 链表尾部插入 insertTail
* 3.1 在指定节点的之前插入 insertBefore
* 3.2 在指定节点的之后插入 insertAfter
* 4.1 根据对应的节点上的值删除节点 deleteByNode
* 4.2 根据对应的节点删除节点 deleteByValue
*/
public class SinglyLinkedList {
private Node head = null;
public static class Node{
public int data;
public Node next;
public Node() {
}
public Node(int data, Node node) {
this.data = data;
this.next = node;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getNode() {
return next;
}
public void setNode(Node node) {
this.next = node;
}
}
/**
* 根据值查询返回节点
* @param data
* @return
*/
public Node findByValue(int data){
Node p = head;
while (p!=null && p.data != data){
p = p.next;
}
return p;
}
/**
* 根据角标查询返回指定的角标的值的节点
* @param raduis
* @return
*/
public Node findByIndex(int raduis){
Node p = head;
int pos = 0;
while (p!=null && pos != raduis){
p = p.next;
pos++;
}
return p;
}
/**
* 插入新的节点数据
* @param data
*/
public void insertToHead(int data){
Node newNode = new Node(data,null);
insertToHead(newNode);
}
/**
* 新节点
* @param newNode
*/
public void insertToHead(Node newNode){
if(head == null){
head = newNode;
}else {
newNode.next = head;
head = newNode;
}
}
/**
* 尾部插入
* @param data
*/
public void insertTail(int data){
Node newNode = new Node(data,null);
insertTail(newNode);
}
public void insertTail(Node newNode){
if(head == null){
head = newNode;
}else {
Node p = head;
while (p != null){
p = p.next;
}
p.next =newNode;
}
}
/**
* 在指定的节点之前插入节点数据
* @param node 指定的节点
* @param newNode 要插入的新的数据
*/
public void insertBefore(Node node,Node newNode){
if(node == null ){
return;
}
if(head == null){
insertToHead(newNode);
}
Node p = head;
while (p!= null && p.next!= node){
p = p.next;
}
if(p == null){
return;
}
newNode.next = node;
p.next = newNode;
}
/**
* 在指定的节点之后插入数据
* @param node 指定的节点
* @param newNode 要插入数据
*/
public void insertAfter(Node node,Node newNode){
if(node == null){
return;
}
if(head == null){
insertToHead(newNode);
}
newNode.next = node.next;
node.next = newNode;
}
/**
* 删除指定的节点
* @param node 指定的节点数据
*/
public void deleteByNode(Node node){
if(head == null || node == null ){
return;
}
if(node == head){
head = head.next;
}
Node p = head;
while (p!= null && p.next != node){
p = p.next;
}
if(p == null){
return;
}
p = p.next.next;
node.next = null;
}
/**
* 根据指定的值删除对应的链表节点
* @param value 对应的值
*/
public void deleteByValue(int value){
if(head == null){
return;
}
Node p = head;
Node prev = null;
while (p!=null && p.data != value){
prev = p;
p = p.next;
}
if(p == null){
return;
}
if(prev == null){
head = head.next;
}else {
prev.next = p.next;
p.next = null;
}
}
}