移除单链表中特定元素
问题描述:
6->2->6->4->6 val=6
2->4
问题思路:
第一种解题方法:创建虚拟头节点,判断链表是否为空,若为空则直接返回null,若不为空,则遍历链表比较删除指定元素,返回头节点。
第二种解题方法:不创建虚拟头节点,需判断链表是否为空、考虑删除头节点、删除连续节点情况。
建议第一种方法,思路清晰,操作简便。
第一种方法源代码:
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class Solution {
public static ListNode reverseList(ListNode head, int val) {
ListNode dummyHead=new ListNode(-1);//创建虚拟头节点(作用为操作统一)
dummyHead.next=head;//连接头节点
if(head==null){
return head;
}else{
for(ListNode temp=dummyHead;temp!=null;temp=temp.next){//遍历链表
if(temp.next.val==val){//遍历链表从虚拟头节点开始,故temp.next为实际头节点
temp.next=temp.next.next;
}else{
temp=temp.next;
}
}
}
return dummyHead.next;//返回实际头节点
}
public static void main(String[] args){
ListNode listNode1=new ListNode(6);
ListNode listNode2=new ListNode(2);
ListNode listNode3=new ListNode(6);
ListNode listNode4=new ListNode(4);
ListNode listNode5=new ListNode(6);
listNode1.next=listNode2;
listNode2.next=listNode3;
listNode3.next=listNode4;
listNode4.next=listNode5;
ListNode prev=reverseList(listNode1,6);
for(ListNode temp=prev;temp!=null;temp=temp.next){
System.out.print(temp.val+"->");
}
}
}
核心算法详解:
执行结果:
!
第二种方法源代码:
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class Solution {
public static ListNode reverseList(ListNode head,int val) {
if(head==null){//判断是否为空链表
return null;
}
//6->6->1
while(head!=null&&head.val==val){//判断是否头节点为指定元素
head=head.next;
}
ListNode prev=head;
//1->2->6->2
while (prev.next!=null) {//头节点为非指定元素情况
if (prev.next.val == val) {
prev.next = prev.next.next;
} else {
prev = prev.next;
}
}
return head;
}
public static void main(String[] args){
ListNode listNode1=new ListNode(6);
ListNode listNode2=new ListNode(2);
ListNode listNode3=new ListNode(6);
ListNode listNode4=new ListNode(4);
ListNode listNode5=new ListNode(6);
listNode1.next=listNode2;
listNode2.next=listNode3;
listNode3.next=listNode4;
listNode4.next=listNode5;
ListNode prev=reverseList(listNode1,6);
for(ListNode temp=prev;temp!=null;temp=temp.next){
System.out.print(temp.val+" ");
}
}
}