Java实现带有头结点的单链表的增删改查!
在这里就不解释了,代码里有注释很容易看懂的!
package List;
/**
* @author ganxiang
* @IDE IntelliJ IDEA
* @project_name JavaDemo
* @filename SingalList
* @date 2020/02/24
*/
public class SignalList {
class DefineNode{//创建带头结点的链表,head->data1->data2->data3
int data;
DefineNode next;
public DefineNode(int d){
this.data=d;
}
}
DefineNode head;
public void insret_one(int dex){//插入一个节点
if(head==null){
head =new DefineNode(dex);
System.out.println(head.data);
}
}
DefineNode temp ;
public DefineNode insert_many(){//插入多个节点,这里插入6个
for (int i=10;i<=15;i++){
if (temp==null) {
temp = new DefineNode(i);
}
else {
DefineNode node =temp;
while (node.next!=null){
node=node.next;//找到尾结点 将值赋给尾结点
}
node.next=new DefineNode(i);
}
}
return temp;
}
public int getSize(DefineNode t) {//计算链表的长度
int size=0;
while(t!=null){
size++;
t=t.next;
}
return size;
}
public int printList(DefineNode t){//打印链表
while (t!=null){
System.out.println(t.data);
t=t.next;
}
return 0;
}
public DefineNode addFirst(int data,DefineNode t){//插入链表中的第一个节点(头结点)
DefineNode node = new DefineNode(data);
if (t ==null){
t=node;
}
else{
node.next =t;
t =node;
// printList(t);
}
return t;
}
public void addLast(int data){//插入链表中的最后一个节点(尾节点)
DefineNode node =new DefineNode(data);
DefineNode t=temp;
if (t ==null){
t=node;
}
else{
while (t.next!=null){
// System.out.println(t.data);
t =t.next;
}
t.next =node;
}
}
public DefineNode inset_index(DefineNode t, int k,int data){//指定索引插入节点
int size =getSize(t);
if (k<1||k>size)System.out.println("无法插入数据!");
else{
if (k==1)return addFirst(data,t);
else {
// if(t==null){
// t =new DefineNode(data);
// }
if (k ==size){
addLast(data);
}
else {
int count =1;
DefineNode tt=t;//保证头结点不变
while(tt!=null&&count<k-1){
count++;
tt=tt.next;
}
DefineNode a ;//将a节点等于插入索引位置前一个节点
a = new DefineNode(data);//给a节点插入数据
a.next = tt.next;
tt.next = a;
// printList(a);
}
}
}
return t;
}
public DefineNode delFirst(DefineNode t){//删除头结点
DefineNode a;
if (t==null)System.out.println("无法操作链表,链表为空!");
else{
a = t.next;
t=a;
}
return t;
}
public DefineNode delLast(DefineNode t){//删除尾节点
DefineNode a =t;
if (t==null)System.out.println("无法操作链表,链表为空!");
else{
while (a.next.next!=null){
a = a.next;
}
a.next =null;
}
return t;
}
public DefineNode del_index(int k,DefineNode t){//根据索引删除节点
DefineNode a=t;
int count =1;
if (k<1||k>getSize(a))System.out.println("不符合链表的操作范围!");
else {
if (k==1)return delFirst(a);
else if (k==getSize(a))return delLast(a);
else {
while (a != null && count <k - 1) {
a = a.next;
count++;
// System.out.println(count);
}
DefineNode s = a;
s.next = s.next.next;
a=s;
// printList(a);
}
}
return t;
}
public DefineNode upsataFirst(int data,DefineNode t){//修改第一个节点
DefineNode a =t;
if (a==null){
a = new DefineNode(data);
t=a;
}
else {
a =new DefineNode(data);
a.next=t.next;
t=a;
}
return t;
}
public DefineNode updataLast(int data,DefineNode t){//修改最后一个节点
DefineNode a=t;
if (a==null)System.out.println("空链表无法操作!");
else {
while(a.next.next!=null){
a=a.next;
}
// printList(a);
DefineNode s =new DefineNode(data);
a.next =s;
}
return t;
}
public DefineNode updata_index(int data,DefineNode t,int k){//根据索引来修改节点
DefineNode a =t;
if (k<1||k>getSize(a))System.out.println("不在操作范围!");
else
{
if (k==1)return upsataFirst(data,a);
else if (k==getSize(a))return updataLast(data,a);
else {
int count =1;
DefineNode s =new DefineNode(data);
while (a.next!=null&&count<k-1){
count++;
a=a.next;
}
// printList(a);
s.next=a.next.next;
// printList(s);
a.next=s;
// printList(a);
}
}
return t;
}
public static void main(String[] args) {
SignalList signal =new SignalList();
// signal.insret_one(6);
signal.insert_many();//增加节点
int size = signal.getSize(signal.temp);
System.out.println("insert_many()中链表temp的长度为:"+size);
System.out.println("没指定索引修改时链表为:");
signal.printList(signal.temp);
//增加 add or insert
// DefineNode inset_index =signal.inset_index(signal.temp,3,20);
// System.out.println("指定索引插入后链表为:");
// signal.printList(inset_index);
// System.out.println("指定索引插入后链表长度为:"+signal.getSize(inset_index));
// //删除delete
// DefineNode delFirst = signal.delFirst(signal.temp);//测试删除头结点
// System.out.println("删除头结点的链表为:");
// signal.printList(delFirst);
// DefineNode delLast =signal.delLast(signal.temp);//测试删除尾节点
// System.out.println("删除为结点的链表为:");
// signal.printList(delLast);
// DefineNode del_index = signal.del_index(3,signal.temp);//指定位置删除节点
// System.out.println("删除指定结点的链表为:");
// signal.printList(del_index);
//修改update
// DefineNode updataFirst=signal.upsataFirst(100,signal.temp);
// System.out.println("修改好头结点的链表为:");
// signal.printList(updataFirst);
// DefineNode updataLast =signal.updataLast(120,signal.temp);
// System.out.println("修改好尾结点的链表为:");
// signal.printList(updataLast);
DefineNode updata_index =signal.updata_index(200,signal.temp,5);
System.out.println("修改好指定结点的链表为:");
signal.printList(updata_index);
}
}
运行展示
指定修改第5个节点的值为200.
这里只展示了一个运行的结果,你们可以多调试看看,我运行都没错误的,若有错误之处恳请各位大佬多多指点。