链表的基本知识

1.单向链表的创建

单向链表的节点包含指向下一个节点的指针,定义如下:

//定义单向链表
	public class ListNode{
		public int val;
		public ListNode next;
		public ListNode(int val){
			this.val=val;	
		}
	}

2.哨兵节点

哨兵节点通常位于链表的头部,它的值无任何意义。在一个有哨兵节点的链表中,从第二个节点开始才真正保存有意义的信息

2.1 用哨兵节点简化链表插入操作

在链表的尾部添加一个节点,由于通常只有一个指向单向链表头节点的指针,因此需要遍历链表中的节点直至到达链表的尾部,然后在尾部添加一个节点。

//用哨兵节点简化链表插入操作
	public ListNode append(ListNode head,int value) {
		ListNode newNode=new ListNode(value);
		if(head==null) {
			return newNode;
		}
		ListNode node=head;
		while(node.next!=null) {
			node=node.next;
		}
		node.next=newNode;
		return head;
	}

当输入的链表节点为null时,输入的链表为空。此时,新添加的节点成为链表中的唯一节点,也就是链表的头节点。

另外一种方法,可以首先创建一个哨兵节点,并把该节点当作链表的头节点,然后把原始的链表添加在哨兵节点的后面。当完成添加操作后,再返回链表真正的头节点,也就是哨兵节点的下一个节点

//用哨兵节点简化链表插入操作
	public ListNode append(ListNode head,int value) {
	    ListNode dummy=new ListNode(0);
	    dummy.next=head;
		ListNode newNode=new ListNode(value);
		ListNode node=dummy;
		while(node.next!=null) {
			node=node.next;
		}
		node.next=newNode;
		return dummy.next;
	}

用哨兵节点简化链表删除操作

从链表中删除第一个值为指定值的节点。找到删除节点的前一个节点,然后把该节点的next指针指向它下一个节点的下一个节点。

//删除操作
	public ListNode delete(ListNode head,int value) {
		if(head==null) {//考虑空链表情况
			return head;
		}
		if(head.val==value) {//考虑被删除的节点是头节点的情况
			return head.next;
		}
		ListNode node=head;
		while(node.next!=null) {
			if(node.next.val==value) {
				node.next=node.next.next;
				break;
			}
			node=node.next;
		}
		return head;	
	}

如果在链表的最前面添加一个哨兵节点作为头节点,那么链表不为空,并且链表的头节点无论如何都不会被删除。

//删除操作
	public ListNode delete(ListNode head,int value) {
		ListNode dummy=new ListNode(0);
		dummy.next=head;
		ListNode node=dummy;
		while(node.next!=null) {
			if(node.next.val==value) {
				node.next=node.next.next;
				break;
			}
			node=node.next;
		}
		return dummy.next;	
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值