Java链表

1.单链表

class ListNode {
	int val;
	ListNode next;

	public ListNode(int val) {
		this.val = val;
	}
}

public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		ListNode ln1 = createNode1(a);// 演示尾插法
		ListNode ln2 = createNode2(a);// 演示头插法
		ListNode ln3 = createNode2(a);// 演示链表反转
		ListNode ln4 = createNode1(a);// 演示链表删除

		ListNode n = reverse(ln3);
		delete(ln4, 2);
		print(ln1);
		print(ln2);
		print(n);
		print(ln4);
	}

	public static void print(ListNode ln) {
		ln = ln.next;
		while (ln != null) {
			System.out.print(ln.val + " ");
			ln = ln.next;
		}
		System.out.println();
	}

	// 创建链表(尾插法)
	public static ListNode createNode1(int[] a) {
		ListNode node = new ListNode(-1);// 链表头,无实际意义,遍历是注意跳过
		ListNode head = node;

		for (int i = 0; i < a.length; i++) {
			ListNode newNode = new ListNode(a[i]);
			head.next = newNode;
			head = newNode;
		}
		return node;
	}

	// 创建链表(头插法),反序
	public static ListNode createNode2(int[] a) {
		ListNode node = new ListNode(-1);// 链表头,无实际意义,遍历是注意跳过

		for (int i = 0; i < a.length; i++) {
			ListNode newNode = new ListNode(a[i]);
			newNode.next = node.next;
			node.next = newNode;
		}
		return node;
	}

	// 删除节点
	public static void delete(ListNode ln, int n) {
		ListNode tmp = ln;
		int i = 0;

		if (n < 1) {
			System.out.println("非法下标");
			return;
		}

		while (i < n - 1 && tmp.next.next != null) {
			tmp = tmp.next;
			i++;
		}

		if (i < n - 1) {
			System.out.println("非法下标");
			return;
		}

		ListNode t = tmp.next;
		tmp.next = t.next;
		t = null;
		System.gc();
	}

	// 链表反转(利用头插法)
	public static ListNode reverse(ListNode ln) {
		ListNode newHead = new ListNode(-1);
		newHead.next = null;
		ListNode t = ln.next;
		ListNode tmp;

		while (t != null) {
			tmp = t.next;

			t.next = newHead.next;
			newHead.next = t;
			t = tmp;
		}
		return newHead;
	}

}

2.双链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值