删除指定链表中的字符
方法1:
1.创建一个假结点:fake=new Node(1);//假结点,值为多少无所谓
使:fake.next=head;
Node c1=fake;
node c2=head;
2.当c2不为空时,
if(c2.value=value) //值相等,进行删除
{
c1.next=c2.next; //就跳过了相等的这个值
}
else{
c1=c2;
}
c2=c2.next;
3.最后返回fake.next;
方法2:
1.定义一个新链表,一开始为null; Node newNode=null;
2.创建 Node cur=head;
Node last = null; // 用来记录 newNode 链表的最后一个结点
3.当cur不为空时,将不相等的值放进新链表中
因为下面的代码会变更 cur.next,所以先存起来,ListNode next = cur.next;
1)// 把 cur 尾插到 newList
(1)如果新链表为空,相当于头插
cur.next = newList; newList = cur;
(2)以后尾插时,newList 不是空链表
last.next = cur;
2)负责更新 last,保证 last 始终是最后一个结点,last = cur; //
3)最后,cur = next
4.处理head等于null的情况
if (last != null) {
last.next = null; // 保证了最后一个结点的 next == null
}
5.返回newNode;
public static Node removeElements1(Node head,int value){
if(head==null){
return null;
}
//创建一个结点,让结点的下一个等于原来的第一个结点,这样最后就不用再考虑头结点
Node fakeHead=new Node(1);
fakeHead.next=head;
Node prev=fakeHead;
Node cur=head;
while(cur!=null){
if(cur.value==value){
prev.next=cur.next;
}
else{
prev=cur;
}
cur=cur.next;
}
return fakeHead.next;
}
public static Node removeElements2(Node head,int value){
if(head==null){
return null;
}
Node newNode=null;
Node last=null; //用来记录newNode链表中的最后一个结点
Node cur=head;
while(cur!=null){
Node next=cur.next;
if(cur.value!=value){
//把cur尾插到newNode
if(newNode==null){
//第一次尾插时,newNode为空链表
cur.next=newNode;
newNode=cur;
}
else{
//以后尾插时,newNode不再是空链表
last.next=cur;
}
last=cur;//负责更新last,保证last始终是最后一个结点
}
cur=next;
}
if(last!=null){ //处理head==null的情况
last.next=null; //保证最后一个结点的next=null
}
return newNode;
}