链表

1.连标的插入

1>头插
1.1 如果原链表为空,return node;
1.2不为空则node.next=head;head=node;

2.尾插
2.1如果原链表为空,return node;
2.2不为空,找到倒数第一个记为last,last.next=node;return head

3.中间插入
3.1pos处插入100
3.2node.next=pos.next;pos.next=node;

2.链表的删除

1.头删
1.1原链表为空,返回错误
1.2不为空 head=head.next; return head;

2.尾删
2.1原链表为空,报错
2.2不为空,找到倒数第二个记为lastSecond,让lastSecond=null;

3.中间删除****
pos.next=pos.next.next;

**

3.代码

**`// 前驱 prev previous
// 后继 next
class Node {
int val; // data | element
Node next; // 如果 next == null 表示是最后一个结点

Node(int val) {
	this.val = val;
	this.next = null;      
}

public String toString() {
	return String.format("Node(%d)", val);
}

}

public class MyLinkedList {
public static void main(String[] args) {
Node head = null;
// head 的意思是链表的第一个结点
// 通过第一个结点,就可以找到完整的链表的所有结点
// 所以,链表的第一个结点往往代表整个链表

	// 空的链表,就是一个结点都没有的链表
	// 也就没有第一个结点
	// head == null 表示第一个结点不存在
	// 也就是整个链表为空
	
	
	
	// 头插
	/*
	int val = 0;
	// 1. 结点
	Node node = new Node(val);
	// 2. 让原来的 head 成为 node 的下一个结点              
	node.next = head;
	// 3. 更新第一个结点的引用
	head = node;
	
	pushFront(head, 0);
	*/
	
	head = pushFront(head, 0);
	head = pushFront(head, 1);
	head = pushFront(head, 2);
	
	// 打印
	print(head);	// 2 1 0
	
	// 尾插
	head = popFront(head);
	print(head);	// 1 0
	
	head = pushBack(head, 10);
	head = pushBack(head, 20);
	head = pushBack(head, 30);
	print(head);	// 1 0 10 20 30
	head = popBack(head);
	head = popBack(head);
	head = popBack(head);
	head = popBack(head);
	head = popBack(head);
	
	head = popBack(head);	// 报错
	print(head);		// 空
	
	head = pushBack(head, 100);
	print(head);		// 100
}

// 打印
private static void print(Node head) {
	System.out.println("打印链表:");
	for (Node cur = head; cur != null; cur = cur.next) {
		System.out.print(cur + " --> ");
	}
	System.out.println("null");
}

// 头插
// head: 原来的第一个结点
// val:要插入的值
// 返回:新的第一个结点
private static Node pushFront(Node head, int val) {
	// 1. 结点
	Node node = new Node(val);
	// 2. 让原来的 head 成为 node 的下一个结点
	node.next = head;
	// 3. 更新第一个结点的引用
	return node;
}


//尾插                                                  
private static Node pushBack(Node head, int val) {
	Node node = new Node(val);
	if (head == null) {
		return node;
	} else {
		Node last = head;
		while (last.next != null) {
			last = last.next;
		}
		last.next = node;
		
		return head;
	}
}



//头删
private static Node popFront(Node head) {
	if (head == null) {
		System.err.println("空链表无法删除");
		return null;
	}
	
	// 原来第一个结点,会因为没有引用指向而被回收
	return head.next;
}


//尾删
private static Node popBack(Node head) {
	if (head == null) {
		System.err.println("空链表无法删除");
		return null;
	}
	
	if (head.next == null) {
		return null;
	} else {
		Node lastSecond = head;
		while (lastSecond.next.next != null) {
			lastSecond = lastSecond.next;
		}
		
		lastSecond.next = null;
		return head;
	}
}
//在链表某一个位置插入数
public class MyLinkedList {
    public static void main(String[] args) {
        Node head = new Node(1);
        head.next = new Node(2);
        head.next.next = new Node(3);
        head.next.next.next = new Node(4);

        Node pos = head.next.next;
        pushAfter(pos, 100);

        // 1, 2, 3, 100, 4
    }
   //插入pos的后面
    private static void pushAfter(Node pos, int val) {
        Node node = new Node(val);

        node.next = pos.next;
        pos.next = node;
    }
//将pos后面的一个数删除掉
    private static void popAfter(Node pos) {
        pos.next = pos.next.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值