数据结构-单链表相关操作

一:单链表的相关操作

 1.1:单链表增加一个元素

 1.2:单链表删除指定位置的元素(删除某个元素)

 1.3:单链表打印

 1.4:单链表的反转

 1.5:单链表找出倒数第k个节点的元素

 1.6:从尾到头打印一个单链表

 1.7:找出单链表中中间节点的值

二:代码(java实现)

2.1:构造一个节点,相当于Java中的结构体

	/**
	 * 相当于结构体类
	 */
	class ChainNode {
		int data;
		ChainNode next;

		public ChainNode(int data) {
			this.data = data;
		}
	}

2.2:向单链表中增加一个元素

/**
	 * 链表头结点
	 */
	private ChainNode head = null;

	public void setHead(ChainNode head) {
		this.head = head;
	}

	public ChainNode getHead() {
		return this.head;
	}

	/**
	 * 向链表中增加添加数据
	 */
	public void addNode(int data) {
		ChainNode node = new ChainNode(data);
		if (head == null) {
			head = node;
			return;
		}
		ChainNode temp = head;
		// 移动指针到尾节点
		while (temp.next != null) {
			temp = temp.next;
		}
		// 从尾节点插入
		temp.next = node;
	}

2.3:从头到尾输出链表内容

	/**
	 * 输出链表数据
	 */
	public void printList() {
		ChainNode node = head;
		while (node != null) {
			System.out.print(node.data + ",");
			node = node.next;
		}
	}

2.4:从尾到头输出链表内容

	/**
	 * 从尾到头打印节点
	 * 
	 * @param head2
	 *步骤: 1:使用递归的方式,在C语言中我们一般使用栈来解决 
	 * 2:把链表从头到尾遍历一遍放到栈中,在从栈中去读
	 */
	private void printReverseList(ChainNode headNode) {
		if (headNode != null) {
			printReverseList(headNode.next);
			System.out.print(headNode.data + ",");
		}

	}

2.5:删除指定位置的节点

	/**
	 * 链表删除一个某个指定节点的数据
	 */
	private boolean deleteNode(int index) {
		// 数组下表小于0或者大于数组长度
		if (head == null || index < 0 || index > length()) {
			return false;
		}
		if (index == 1) {
			// 删除头节点
			head = head.next;
		}
		// 删除非头节点
		int count = 2;
		ChainNode preNode = head;
		ChainNode curNode = preNode.next;

		while (curNode != null) {
			if (count == index) {
				preNode.next = curNode.next;
				curNode.next = null;
				return true;
			}

			// 坐标后移
			preNode = curNode;
			curNode = curNode.next;
			count++;
		}
		return false;
	}

2.6:实现链表的反转

/**
	 * 实现链表的反转 
	 * 步骤 1:用三个指针 preNode,currentNode,nextNode, next暂存下一个节点
	 */
	private void reverserNode() {
		if (head == null) {
			return;
		}
		ChainNode preNode = head;
		ChainNode curNode = head.next;
		ChainNode nextNode = null;
		while (curNode != null) {
			// 暂存下一节点
			nextNode = curNode.next;
			// 当前节点指向上一个节点
			curNode.next = preNode;
			// 指针后移
			preNode = curNode;
			curNode = nextNode;
		}
		head.next = null;
		this.head = preNode;
	}

2.7: 找出单链表中倒数第k个节点

	 * 找出单链表中倒数第K个位置 
	 * 步骤:
	 *  1:设置两个指针,第一个指针比第二个指针早走K步, 
	 *  2:第一个指针到达末尾.第二个指针刚好在第K的位置
	 * 
	 */
	private ChainNode findInverseNode(int k) {
		if (head == null || k < 0 || k > length()) {
			return null;
		}
		ChainNode frontNode = head;
		ChainNode rearNode = head;
		for (int i = 0; i < k; i++) {
			rearNode = rearNode.next;
		}
		while (rearNode.next != null) {
			frontNode = frontNode.next;
			rearNode = rearNode.next;
		}
		return frontNode;
	}

2.8:找出链表中的中间节点的值

 /**
     * 寻找单链表的中间节点
     * 思路:
     *  设置两个工作指针,frontNode一次走一步、rearNode一次走两步
     *  当rearNode到达链表尾部时,frontNode指向的就是单链表的中间节点
     *  注:
     *      当链表的个数为奇数时,frontNode指向的就是中间的节点
     *      当链表的个数为偶数时,frontNode指向的节点和frontNode。next都是链表的中间节点
     */
	private ChainNode findMidNode() {
		ChainNode frontNode = head;
        ChainNode rearNode = head;
        while(rearNode != null && rearNode.next != null && rearNode.next.next != null){
            frontNode = frontNode.next;
            rearNode = rearNode.next.next;
        }
        return frontNode;
	}
三:源代码下载





扫描二维码关注公众号,回复: 42393 查看本文章




猜你喜欢

转载自blog.csdn.net/qq_37154446/article/details/80036731