最近在看数据结构,刚开始看链表的时候,很迷糊,什么头结点,头指针,首结点的傻傻分不清楚,现在明白啦:
1、只要是链表都有头指针,暂时用head表示;链表中的第一个结点称为首结点,最后一个结点称为尾结点
2、头结点的存在是为了方便操作,针对单链表来说,如果带头结点的话,头指针指向头结点,头结点指向首结点;如果不带头结点的话,头指针指向首结点,如果进行插入和删除操作,必须要注意是否是在链表头进行,要分情况处理,而带头结点的不用分情况,比较方便。
下边是我写的头结点和不带头结点的单链表程序:都是验证过的,对的
/**
* 无头结点的单链表:当在首结点前插入或者删除首结点的时候需要改变头指针head
*/
package com.two;
import java.util.Scanner;
public class NoLinkList{
private Node head;//头指针
public NoLinkList(){
head = null;
}
//利用头插法或者尾插法插入数据,注意:当插入数据类型不是int的时候,需要修改一下
public NoLinkList(int length,boolean headORrear) throws Exception{
this();
if(headORrear){
insertHead(length);//头插法
}else{
insertRear(length);//尾插法
}
}
//利用头插法创建长度为length的单链表
public void insertHead(int length) throws Exception{
Scanner sc = new Scanner(System.in);
for(int i=0;i<length;i++)
{
insert(0,sc.nextInt());
}
}
//利用尾插法创建长度为length的单链表
public void insertRear(int length)throws Exception{
Scanner sc = new Scanner(System.in);
for(int i=0;i<length;i++)
{
insert(length(),sc.nextInt());
}
}
//增:在指定位置上添加结点
public void insert(int index,Object value)throws Exception{
Node node = head ;
int j =0;
//while(node.next!=null && j<index-1){错的
while(node !=null && j<index-1){
node = node.next;
++j;
}
//if(j>index || node==null){
if(index<0 || index>length()){
System.out.println("插入位置不合法");
}
Node newNode = new Node(value);
if(index==0){
//newNode.next = head.next;报错
newNode.next = head;
head = newNode;
}else{
newNode.next = node.next;
node.next = newNode;
}
}
//根据下标删除指定结点
public void delete(int index)throws Exception{
Node node = head;
int j = 0;
while(node!=null && j<index-1){
//while(node.next!=null && j<index-1){
node = node.next;
++j;
}
//if(j>index-1 || node.next==null){
if(index<0 || index>=length()){
throw new Exception("删除位置不合法");
}
if(index==0){
head = head.next;
}else{
node.next = node.next.next;
}