06-java算法学习之一(链表问题)

荷叶罗裙一色裁,芙蓉向脸两边开。 乱入池中看不见,闻歌始觉有人来。----王昌龄

在我第一篇博客中,我利用单链表制作了一个“学生成绩管理系统“。链表有单链表,双链表和循环链表,所以我想就我之前学习的链表,做一个总结,对比分析。

1. 单向链表
2. 双向链表

考虑链表问题的关键在于,你是否一想到链表,脑子里就能马上出现一幅画面
在这里插入图片描述

!链表的共同之处,构建节点(node)。

  1. 单链表node的创建。
 class Node{
			public int no;//学号
			public String name;//姓名
			public Node next;//指向下一结点
			public Node(int no,String name) {
				this.no=no;
				this.name=name;
			}
	}
  1. 双向链表node的创建。
class Node{
	public int no;//学号
	public String name;//姓名
	public Node next;//向后指针
	public Node pre;//向前指针
	public Node(int no,String name) {
		this.no=no;
		this.name=name;
	}
}

1. 我们可以看到,单链表的节点创建的方法和双向链表基本一致,所不同的是单链表的指向只有向后一个方向,而双向链表有向前和向后两个方向。
2.一般情况下,我们需要先创建一个头节点,这个头节点仅仅是一个开头的作用,我们一般不会在里面放入数据。而是在头节点指向的下一节点开始放入数据。比如上面这个的头节点,我们一般会这样写:Node head=new Node(0,"" );
3.我们创建了节点类,然后又创建了头节点。那么接下来,我们如何实现链表的增删改查呢?答案是,创建一个“指针”,C语言有指针,但是,我们java怎么可能有指针这个说法呢?其实,我是说相当于指针,不是指针,但是跟指针效果差不多。
4.创建一个指向头节点的“指针(temp)”,让这个指针指向头节点,即:Node temp=head;
在这里插入图片描述
5.那么,就单链表而言,增删改查就很清楚了。比如说增加数据。我们就是根据这个“指针”去操作的。

		public void add(Node node) {
				//增加辅助指针temp,且这个指针指向头结点
				Node temp=head;//这样我们创建了辅助指针结点,且这个指针指向了头结点
				//前面我们让temp指向了头结点,接下来我们需要找最后一个结点,我们采用遍历的方法
				while(true) {
					//假设辅助指针指向的下一个结点为空,我们就退出,否则我们就让这个辅助指针依次遍历
					if(temp.next==null) {
						break;
					}
					//后一个给前一个
					temp=temp.next;	
				}
				//最后一个指向新的结点
				temp.next=node;
			}

6.我们从删除角度去看下双向链表是怎样工作的。从下面的代码块我们可以知道,其实都差不多,只要脑袋里一直有一幅上面的图片,就很明了了,单链表是一个指向,双向链表是两个指向,只要插入或者删除时考虑两个方向就可以了。

		public void delete(Node node) {
			Node temp=head.next;
			if(temp==null) {
				System.out.println("链表为空");
				return;
			}
			while(true) {
				if(temp==null) {
					break;
				}
				if(temp.next.no==node.no) {
					temp.pre.next=temp.next;
					if(temp.next!=null) {
						temp.next.pre=temp.next;
					}
				}
				temp=temp.next;	
			}
		}

**

总结

**
针对链表问题,我还是觉得,最重要的是理清楚思路,在脑中自动生成上面的图片,这样理解起来就更简单,而且不容易出错。

发布了15 篇原创文章 · 获赞 17 · 访问量 1695
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览