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;
}


被折叠的 条评论
为什么被折叠?



