手撕问题是这样的:
有一个链表,节点的值都是数字,删除最少的节点使得链表中的数字都一样。
---------------------------------------------------------------------------------------------------------------------------------
思路分享:仔细一看,按照一般的思路就可以解出这道题,难度不大。
首先,先建立一个哈希表,然后键是遍历链表得到的数字,然后值是每个数字出现的次数。然后再遍历哈希表,得到最多次数的那个数字,然后再遍历链表,最后将不是该数字的数字都删掉。
(--备注:下面给出的代码都是我手写的,未经调试运行,大致看个思路即可,如果有哪个地方有点错误,恳请指出--)
代码片段:
import java.util.*;
/**
*结构体定义
*/
class ListNode{
int val;
ListNode next;
ListNode(int val){
this.val=val;
next=null;
}
}
public class sameList{
public static void main(String[] args){
ListNode head=new ListNode(1);//构造一个链表
ListNode p=head;
Scanner sc = new Scanner(System.in);
int len=sc.nextInt();
for(int i=0;i<len;i++){
ListNode q=new ListNode(0);
q.val=0;
p.next=q;
p=q;
}
DeleList deli = new DeleList();//创建对象
ListNode k = deli.deleList(head);//传入链表头节点
while(k!=null){
System.out.println(k.val);
k=k.next;
}
}
}
class DeleList{
public ListNode deleList(ListNode head){
ListNode p=head;
Map<Integer, Integer> map = new HashMap<>();
while(p!=null){
map.put(p.val, map.getOrDefault(p.val, 0)+1);
p=p.next;
}
int mark=0, max_num=0;
for(Map.Entry<Integer, Integer> entry : map.entrySet()){//遍历哈希表
Integer key = entry.getKey();
Integer value = entry.getValue();
if(max_num<value){
mark=key;
max_num=value;
}
}
ListNode yum=new ListNode(0);
yum.next=head;
ListNode k=yum;
while(k.next!=null){
if(k.next.val!=mark){
k.next=k.next.next;
}
else{
k=k.next;
}
}
return yum.next;
}
}