头插法:节点插入到链表的头部,也就是addFirst()方法。
单链表:一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置)。参照代码中的Node内部类。
代码中方法介绍:
add():插入到链表尾部。
addFirst():头插法插入到链表头部。
reverseAll():头插法反转整个链表。
public class SingleLinkedList {
//头结点
private Node head;
//节点内部类 单链接只包含数据和next的引用
private static class Node{
int data;//节点数据
Node next;//单链表只有next没有 prev
Node(int data,Node next){
this.data = data;
this.next = next;
}
}
//正常添加,添加成为最后一个节点
public void add(int data){
if(head == null){//没有节点
head = new Node(data, null);
}else{
Node temp = head;
while (true) {
if(temp.next == null){
temp.next = new Node(data, null);;
break;
}else{
temp = temp.next;
}
}
}
}
//头插法 相当于addFirst。节点插入到链表头部
public void addFirst(int data){
if(head == null){//没有节点
head = new Node(data, null);
}else{
Node cur = new Node(data, null);
/*
* 头插法核心代码开始
*/
//当前节点的next指向头结点
cur.next = head;
//当前新建的节点成为头结点。
head = cur;
}
}
//头插法反转整个链表
public void reverseAll(){
Node reverseHead = null;//反转的head
Node cur = head;
Node next = null;
while(cur != null){//每次遍历相当于addFirst(cur); 即 addFirst 中的 newhead == cur;
//因为下面第二行代码就将 cur.next替换了。所以了保存当前节点的下一个节点
next = cur.next;
cur.next = reverseHead;//当前节点的下一个指向了反转的头结点
reverseHead = cur;//当前节点替换为新的反转头结点
/*
* 上面两行代码不正是头插法核心代码吗?两下对比很好理解
cur.next = reverseHead等同于 cur.next = head;
reverseHead = cur; 等同于 head = cur;
*
*/
cur = next;//继续遍历下一个节点
}
//反转的头节点替换成新的头节点
head = reverseHead;
}
//打印整个链表
public void showAll(){
if(head == null){
System.out.println("单链表为空");
}else{
Node temp = head;
while (true) {
System.out.println("节点数据为"+temp.data);
if(temp.next == null){
break;
}else{
temp = temp.next;
}
}
}
}
public static void main(String[] args) {
SingleLinkedList list = new SingleLinkedList();
list.add(1);
list.add(2);
//添加顺序为1,2
list.reverseAll();
//反转后打印顺序为2,1
list.showAll();
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)