一. 链表有无头结点的区别(单链表)
首先 ? 我们需要了解,删除节点p, 我们只需要找到 p的上一个结点pre的位置, 进行 pre.next = p.next 即可。
?头结点: 指针域指向首元结点(具有实际意义的第一个元素结点) ,数据域可以不存任何信息,指针域指向单链表第一个元素的结点。头结点可有可无,但为了操作方便,一般情况下单链表都具有头结点 优点: ?为了减少程序的复杂性(添加和删除操作,在首元结点上有区别与其他的操作 ), 如果链表没有头结点,则删除或添加时都得需要判断一次首元结点,有了头结点以后,首元结点实际为链表的第二个结点,可以使得在添加删除的操作上更具有统一性 缺点: 会多出一个不必要的空间
1 Example1 有头结点
public ListNode removeElement(ListNode head, int val) {
if(head.next==null) return head;
ListNode pre = head, p = head.next;
while(p.val!=val&&p.next!=null) {
pre = p;
p = p.next;
}
if(p.val==val) {
pre.next = p.next;
}else {
}
return head;
}
}
1 Example2 无头结点
public ListNode removeElements(ListNode head, int val) {
if(head==null) return head;
ListNode pre = head, p = head.next;
if(p!=null) {
while(p.val!=val&&p.next!=null) {
pre = p;
p = p.next;
}
if(p.val==val) {
pre.next = p.next;
return head;
}else {
}
}
if(head.val==val) head = head.next;
return head;
}
}
public ListNode removeElements(ListNode head, int val) {
if(head==null) return head;
ListNode p = head, pre;
while(p.val!=val&&p.next!=null) {
pre = p;
p = p.next;
}
if(p.val==val) {
if(p==head) {
return head = p.next;
}else {
pre.next = p.next;
}
}else {
}
return head;
}
}
1 Example3 无头结点(删除链表中所有值为val的结点)
public ListNode removeElements(ListNode head, int val) {
if(head==null) return head;
ListNode pre = head, p = head.next;
while(p!=null) {
while(p.val!=val&&p.next!=null) {
pre = p;
p = p.next;
}
if(p.val==val) {
pre.next = p.next;
}else {
}
p = p.next;
}
if(head.val==val) head = head.next;
return head;
}
}
public ListNode removeElements(ListNode head, int val) {
if(head==null) {
return head;
}
head.next = removeElements(head.next,val);
return head.val==val?head.next:head;
}
public ListNode removeElements(ListNode head, int val) {
ListNode pre = new ListNode(0);
pre.next = head;
ListNode temp = pre;
while(temp.next!=null) {
if(temp.next.val==val) {
temp.next = temp.next.next;
}else {
temp = temp.next;
}
}
return pre.next;
}
//(含头结点)单链表的节点删除,增加—最易犯错!!! https://blog.csdn.net/weixin_46273997/article/details/106087607
|