先定义节点类
class Node{
public Integer no;
public String name;
public Node next;//表示接下来的那个节点
public Node(int no,String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "no:"+this.no+" name:"+this.name;
}
}
然后再定义链表类
class SingleLinkList{
public Node head = new Node(0,"");//一个单链表中一定要有一个头结点。
public void add(Node node) {//添加到链表的尾部
Node temp = head;//头结点是不可以动的,所以用一个临时变量来代替head
while(temp.next!=null) {
temp = temp.next;
}
temp.next = node;
}
public void addByOrder(Node node) {//按照顺序插入一个节点
Node temp = head;
while(temp.next!=null && temp.next.no<node.no) {
temp = temp.next;
}
if(temp.next == null) {
temp.next = node;
}
else {
if(temp.next.no<node.no) {
temp.next = node;
}
else if(temp.next.no>=node.no) {
node.next = temp.next;
temp.next = node;
}
}
}
public void updateNode(Node newNode) {//更新一个节点
if(head.next == null) {
System.out.println("链表为空");
}
Node temp = head.next;
while(temp.no != newNode.no && temp.next != null) {
temp = temp.next;
}
if(temp.no == newNode.no) {
temp.name = newNode.name;
}
else {
System.out.println("链表中没有这个节点");
}
}
public void deleteNode(int n) {
if(head.next == null) {
System.out.println("链表为空");
}
Node temp = head;
while(temp.next != null && temp.next.no != n ) {
temp = temp.next;
}
if(temp.next ==null) {
System.out.println("所需删除的节点不存在");
}
else if(temp.next.no == n) {
temp.next = temp.next.next;
}
}
public void list() {//打印所有的节点
Node temp = head.next;
if(temp == null) {
System.out.println("链表为空");
}
while(temp!=null) {
System.out.println(temp);
temp = temp.next;
}
}
//快慢指针
public Node findLastIndexNode(int index) {
Node temp = head.next;
Node temp2 = head.next;
if(index<=0) {
System.out.println("输入错误");
return null;
}
int i=1;
for(;i<index;i++) {
if(temp.next==null) {
break;
}
temp = temp.next;
}
if(i<index) {
System.out.println("输入的数值过大");
return null;
}
while(temp.next!=null) {
temp = temp.next;
temp2 = temp2.next;
}
return temp2;
}
public void reverseList() {
if(head.next==null || head.next.next==null) {
return ;
}
Node temp = head.next;
Node next = null;//要注意保留当前节点的下一个节点。
Node reverseHead = new Node(0,"");
while(temp!=null) {
next = temp.next;
temp.next = reverseHead.next;//当前节点在插入到新的头结点之后,它的next中保存的不再是之前链表的后一个节点
//所以为了可以继续遍历后一个节点,需要在插入之前就保存好后一个节点
reverseHead.next = temp;
temp = next;
// temp = temp.next;这样写就是错误的,temp在插入新链表之后,next中的值以及变了。
}
head = reverseHead;
}
public void reversePrint(Node node) {
if(node.next == null) {
System.out.println(node);
return ;
}
reversePrint(node.next);
System.out.println(node);
}
public void reverse() {
reversePrint(head.next);
}
}
再来测试一下
public class Day10 {
public static void main(String[] args) {
Node nodeA = new Node(1,"yf1");
Node nodeB = new Node(5,"yf5");
Node nodeC = new Node(3,"yf3");
SingleLinkList list = new SingleLinkList();
list.addByOrder(nodeA);
list.addByOrder(nodeB);
list.addByOrder(nodeC);
Node nodeD = new Node(3,"yf33");
list.deleteNode(1);
list.updateNode(nodeD);
list.list();
}
}