Java链表删除节点操作

1、创建节点类Node

/**
 * 程序目的:建立一组学生成绩的单向链表程序,包含学号、姓名、和成绩3种数据。 只要输入要删除学生的成绩,就可以遍历该链表,并清除学生的节点,
 * 要结束输入时,输入“-1”,则此时会列出该链表未删除的所有学生数据。
 * 
 * @author 86176
 *
 */
//构建节点类
public class Node {
	int data;
	int np;
	String names;
	Node next;

	// 节点声明的构造函数
	public Node(int data, int np, String names) {
		this.data = data;
		this.np = np;
		this.names = names;
		this.next = null;
	}

	
}

2、定义指针类以及构建链表,删除节点方法

/**
 * 程序目的:定义头结点和尾结点的节点指针,以及建链表方法和删除节点方法
 * @author 86176
 *
 */
	public class StuLinkedList {
		public Node first;
		public Node last;

		public boolean isEmpty() {
			return first == null;
		}

		// 创建输入方法
		public void print() {
			Node current = first;
			while (current != null) {
				System.out.println("[" + current.data + "" + current.names + "" + current.np + "]");
				current = current.next;
			}
			System.out.println();
		}

		// 创建插入方法
		public void insert(int data, String names, int np) {
			Node newNode = new Node(data, np, names);
			if (this.isEmpty()) {
				first = newNode;
				last = newNode;
			} else {
				last.next = newNode;
				last = newNode;
			}
		}

		// 创建删除节点的方法
		public void delete(Node delNode) {
			Node newNode;
			Node tmp;
			// 删除链表的第一个节点,只需要把链表首指针指向第二个节点即可
			if (first.data == delNode.data) {
				first = first.next;
			}
			// 删除链表后的最后一个节点,只要将指向最后一个节点的指针直接指向null即可
			else if (last.data == delNode.data) {
				System.out.println("I am here\n");
				newNode = first;
				while (newNode.next != last) {
					newNode = newNode.next;
					newNode.next = last.next;
					last = newNode;
				}
			} 
			//删除链表内的中间节点:只要将删除节点的前一个节点指针指向要删除节点的下一个节点即可
			else {
				newNode = first;
				tmp = first;
				while (newNode.data != delNode.data) {
					tmp = newNode;
					newNode = newNode.next;
				}
				tmp.next = delNode.next;
			}
		}

	}

3、实例:输入要删除学生的成绩,清除节点,结束输入时输入-1

import java.io.*;
import java.util.*;


/**
 * 程序目的:利用链表建立、删除和打印学生成绩
 * 
 * @author 86176
 *
 */
public class CH03_02 {

	public static void main(String[] args) throws  IOException {
		BufferedReader buf;
		Random rand = new Random();
		buf = new BufferedReader(new InputStreamReader(System.in));

		StuLinkedList List = new StuLinkedList();
		int i, j, findword = 0, data[][] = new int[12][10];
		String name[] = new String[] { "Allen", "Scott", "Bell", "Kobe", "Jamse", "Jack", "Gorge", "Yao", "Bob", "Lisa",
				"Hanson", "Amy" };
		System.out.println("学号  成绩  学号  成绩  学号  成绩   学号  成绩\n");
		for (i = 0; i < 12; i++) {
			data[i][0] = i + 1;
			data[i][1] = (Math.abs(rand.nextInt(50))) + 50;
			List.insert(data[i][0], name[i], data[i][1]);
		}
		for (i = 0; i < 3; i++) {
			for (j = 0; j < 4; j++) {
				System.out.println("["+data[j*3+i][0]+"]["+data[j*3+i][1]+"]");
				System.out.println();
			}
			while(true)
			{
				System.out.println("输入要删除成绩的学号,结束输入-1");
				findword=Integer.parseInt(buf.readLine());
				if (findword==-1) {
					break;
				}else {
					Node current=new Node(List.first.data,List.first.np,List.first.names);
					current.next=List.first.next;
					while(current.data!=findword) {
						current=current.next;
						List.delete(current);
					}
					System.out.println("删除后成绩链表,请注意!要删除的成绩其学号必须在此链表中\n");
					List.print();
				}
			}
		}
	}

}


输出:
学号  成绩  学号  成绩  学号  成绩   学号  成绩

[1][78]

[4][77]

[7][67]

[10][75]

输入要删除成绩的学号,结束输入-1
1
删除后成绩链表,请注意!要删除的成绩其学号必须在此链表中

[1Allen78]
[2Scott82]
[3Bell78]
[4Kobe77]
[5Jamse59]
[6Jack52]
[7Gorge67]
[8Yao99]
[9Bob91]
[10Lisa75]
[11Hanson57]
[12Amy61]

输入要删除成绩的学号,结束输入-1
-1
[2][82]

[5][59]

[8][99]

[11][57]

输入要删除成绩的学号,结束输入-1

 

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值