java实现单链表,巩固基础

package test.written.examination;

public class SingleLinkedList {
	public class Node {
		int data;
		Node next;

		public Node(int n) {
			data = n;
			next = null;
		}

		public Node() {
			data = 0;
			next = null;
		}

	}

	Node head, tail;

	public SingleLinkedList() {
		head = tail = null;
	}

	public void mp() {
		if (head == null) {
			System.out.println("empty!");
		} else {
			System.out.print(head.data + ",");
			Node node;
			node = head.next;
			while (node != null) {
				System.out.print(node.data + ",");
				node = node.next;
			}
		}
	}

	// 添加在头部
	public void addHeadNode(int n) {
		Node t = new Node(n);
		if (head == null) {
			head = t;
		} else {
			t.next = head;
			head = t;
		}

	}

	// 添加在尾部
	public void addTailNode(int n) {
		Node p = head;
		if (p == null) {
			head = new Node(n);
			return;
		}
		Node tmp = null;
		while (p != null) {
			tmp = p;
			p = p.next;
		}
		tmp.next = new Node(n);
	}

	// 只删除第一个data=n的节点
	public void deleteOne(int n) {

		if (head.data == n) {
			head = head.next;
			return;
		}
		Node pre = head;
		Node q = pre.next;
		while (q != null) {

			if (q.data == n) {
				pre.next = q.next;
				q = q.next;
				break;
			} else {
				pre = q;
				q = q.next;
			}
		}
	}

	// 删除所有data=n的节点
	public void deleteAll(int n) {

		if (head.data == n) {
			head = head.next;

		}
		Node pre = head;
		Node q = pre.next;
		while (q != null) {

			if (q.data == n) {
				pre.next = q.next;
				q = q.next;
			} else {
				pre = q;
				q = q.next;
			}
		}
	}

	public void depul() {

		Node p = head;
		Node pre;
		Node q;
		int da;
		while (p != null) {
			da = p.data;
			q = p.next;
			pre = p;

			while (q != null) {

				if (q.data == da) {
					pre.next = q.next;
					q = q.next;
				} else {
					pre = q;
					q = q.next;
				}
			}
			p = p.next;
		}

	}

	public void sort() {
		Node p = head;
		Node q;
		int tmp;
		while (p != null) {
			q = p.next;
			while (q != null) {
				if (p.data > q.data) {
					tmp = p.data;
					p.data = q.data;
					q.data = tmp;
				}
				q = q.next;
			}
			p = p.next;
		}
	}

	public void reverse() {
		Node tmp;
		Node p = head;
		Node q = p.next;
		while (q != null) {
			tmp = q.next;
			q.next = p;
			p = q;
			q = tmp;
		}
		head.next = null;
		head = p;
	}

	// 指定位置插入节点,插入在第n个节点之后
	public void insert(int loc, int data) {
		if (loc < 0) {
			System.out.println("loc 必须是大于或等于 0");
			return;
		} else {
			if (loc == 0) {
				// 插在头部
				Node newNode = new Node(data);
				newNode.next = head;
				head = newNode;
			} else {
				Node p = head;
				Node pre = null;
				int n = 0;
				while (p != null) {
					
					if (n == loc) {
						Node newNode = new Node(data);
						pre.next = newNode;
						newNode.next = p;
						
						break;
					}
					n++;
					pre = p;
					p = p.next;
				}
				if(loc > this.length()){
				//当loc大于链表长度时插在末尾;
				pre.next = new Node(data);
				}
			}
		}
	}

	// 返回链表长度
	public int length() {
		int len = 0;
		Node p = head;
		while (p != null) {
			len++;
			p = p.next;
		}
		return len;
	}

	public static void main(String[] args) {
		int[] arr = { 1, 5, 6, 6, 6, 5, 8, 9, 7, 9, 0, 0, 0, 0, 10, 1 };
		SingleLinkedList list = new SingleLinkedList();
		SingleLinkedList list2 = new SingleLinkedList();
		for (int i : arr) {
			list.addHeadNode(i);
			list2.addTailNode(i);
		}
		System.out.println("原始长度:" + list.length());
		System.out.println("原始链表初始化(addTailNode):");
		list2.mp();
		System.out.println("\n原始链表初始化(addHeadNode):");
		list.mp();
		System.out.println("\nsort():");
		list.sort();
		list.mp();
		System.out.println("\ndeleteOne(6):");
		list.deleteOne(6);
		list.mp();
		System.out.println("\ndeleteAll(1):");
		list.deleteAll(1);
		list.mp();
		System.out.println("\nreverse():");
		list.reverse();
		list.mp();
		System.out.println("\ndepul():");
		list.depul();
		list.mp();
		System.out.println("\ninsert(1,999):");
		list.insert(3, 999);
		list.mp();
	}

}


Output:

原始长度:16
原始链表初始化(addTailNode):
1,5,6,6,6,5,8,9,7,9,0,0,0,0,10,1,
原始链表初始化(addHeadNode):
1,10,0,0,0,0,9,7,9,8,5,6,6,6,5,1,
sort():
0,0,0,0,1,1,5,5,6,6,6,7,8,9,9,10,
deleteOne(6):
0,0,0,0,1,1,5,5,6,6,7,8,9,9,10,
deleteAll(1):
0,0,0,0,5,5,6,6,7,8,9,9,10,
reverse():
10,9,9,8,7,6,6,5,5,0,0,0,0,
depul():
10,9,8,7,6,5,0,
insert(1,999):
10,9,8,999,7,6,5,0,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值