- 思路分析:
- 刚开始,我默认头结点不带数据,只用做标识链表的开端,但是写完代码是错的,因为这个题中,头结点时带数据的,但是之前学习的都是带头结点的计算方式,那么这个时候,就有了一个非常关键的思路
- 把不带头结点的链表转换为带头结点的链表,这样子就可以利用我们之前的方式完成该题目
- 所以创建一个dummyHead虚拟头结点,并令dummyHead.next = head
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//创建一个虚拟头结点
ListNode dummyHead = new ListNode(val-1,head);
ListNode temp = dummyHead;
while(temp.next!=null){
//
if(temp.next.val == val){
//删除结点
temp.next = temp.next.next;
}else{
temp = temp.next;
}
}
/*
这里一定要head = dummyHead.next,因为如果head结点被删除,那么如果不进行这个操作,返回
的就是原始链表
因为(temp.next = temp.next.next)==>dummyHead.next=dummyHead.next.next,也就
是把head结点摘下来了,那么如果返回的是head结点,返回的就是原始链表
所以一定要做这个步骤,更新链表的头结点
*/
head = dummyHead.next;
return head;
}
}
- 别人的思路–> 递归
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head==null)
return null;
head.next=removeElements(head.next,val);
if(head.val==val){
return head.next;//那么返回后相当于head.next = head.next.next,也就是删除head.next
}else{
return head;//那么返回后相当于head.next = head.next,也就是不做任何操作
}
}
}
但是递归的方法应该是有限制的,当链表结点元素很多的时候,有可能造成栈溢出,所以思路很好,但是个人觉得不适用,各位看到该文的xdm可以一起讨论讨论