2.链表的实现:带哨兵

1.带哨兵的单链表的定义

/**
 * 单向链表----带哨兵
 */
public class SinglyLinked {

	/**
	 * 节点类
	 * 数据域和地址域
	 */
	private static class Node {
		int value; //值
		Node next; // 指向下一个节点

		public Node() {

		}

		public Node(int value, Node next) {
			this.value = value;
			this.next = next;
		}

	}

	/**
	 * 1.头指针
	 */
	private Node head = new Node(0, null);

}

2.向链表尾部添加元素,先找最后一个节点,然后插入

	public Node findLast() {
		Node p = head;
		while (p.next != null) {
			p = p.next;
		}
		return p;
	}

2.链表的实现:带哨兵_第1张图片

 

public void addLast(int value) {
		Node last = findLast();
		last.next = new Node(value, null);
	}

3.按照索引查找节点,条件是一直找到最后为空 p!=null

	private Node findNode(int index) {
		int i = -1;
		for (Node p = head; p != null; p = p.next, i++) {
			if (i == index) {
				return p;
			}
		}
		return null; // 没找到
	}

头结点的序号是-1,所以i=-1开始 

	public void get(int index) {
		Node node = findNode(index);
		if (node == null) {
			System.out.println("没找到");
			return;
		}
		System.out.println(node.value);
	}

4.索引位置index插入一个值

先找到index-1的节点,然后在后面插入,先让新节点连接。

	public void insert(int index, int value) {
		Node p = findNode(index - 1);
		if (p == null) {
			System.out.println("插入失败");
			return;
		}
		// 插入节点
		p.next = new Node(value, p.next);
	}

5.向链表头部添加节点

直接调用index()方法,插入索引位置是0

	public void addFirst(int value) {
		insert(0, value);
	}

6.按照索引位置删除

2.链表的实现:带哨兵_第2张图片

	public void remove(int index) {
		Node pre = findNode(index - 1);
		if (pre == null) {
			System.out.println("删除失败");
			return;
		}
		// 指向删除节点
		Node removed = pre.next;
		if (removed == null) {
			System.out.println("删除失败");
			return;
		}
		pre.next = removed.next;
	}

7.遍历 

条件是p!=null,节点全部读取

	public void loop() {
		Node p = head.next;
		while (p != null) {
			System.out.println(p.value);
			p = p.next;
		}
	}

你可能感兴趣的:(数据结构,链表,数据结构,java)