头插法反转整个单链表(java完整代码)

头插法反转整个单链表(java完整代码),第1张

头插法:节点插入到链表的头部,也就是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();
	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/916494.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存