package myList;
/*
* �õ���������ͷ�ڵ�ġ�
*/
public class MyLinkedList {
private int theSize; //����Ĵ�С��
private Node headNode; //ͷ�ڵ�
//�ڵ���ࡣ
public static class Node{
private Object data;
private Node node;
public Node(){
}
public Node(Object data, Node node) {
this.data = data;
this.node = node;
}
public Object getDate(){
return data;
}
}
//���췽������ʼ��ʱ������һ����ͷ�ڵ�Ŀյ�����
public MyLinkedList(){
clear();
}
//���ͷ�ڵ�
public Node getHeadNode(){
return headNode;
}
//�������
public void clear(){
headNode=new Node(null,null); //ͷ����ʼ��������date��ָ��nodeȫ������Ϊnull.
theSize=0; //��Ĵ�С����
}
//��ȡ��Ĵ�С
public int size(){
return theSize;
}
//��ӽڵ㵽����β����
public void add(Object aData){
add(theSize+1,aData);
}
//��ӽڵ㵽ָ��λ�á�
public void add(int idx,Object aDate){
//����һ���µĽڵ�
Node newNode=new Node();
newNode.data=aDate;
//���������ҵ�ָ��λ�õĽڵ㣬�����½ڵ�嵽ָ��λ�ýڵ��ǰ��һ��λ�á�
Node p,q;
p=headNode;
for(int i=1;i<idx;i++){
p=p.node;
}
q=p.node;
p.node=newNode;
newNode.node=q;
theSize++;
}
//ɾ���ڵ㡣
public void remove(int idx) {
if(idx<0||idx>size()){
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
Node p,q;
p=headNode;
for(int i=1;i<idx;i++){
p=p.node;
}
q=p.node;
p.node=q.node;
theSize--;
}
//���ݽDZ�������
public int get(int idx){
if(idx<1||idx>size()){
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
Node p=headNode;
for(int i=1;i<=idx;i++){
p=p.node;
}
return (int)p.data;
}
//��ȡMyIterator�ӿڶ���
public MyIterator myIterator(){
return myIterator(this);
}
public MyIterator myIterator(Object arr){
MyIterator i=new MyIterator(arr);
return i;
}
//��ӡ������
public void print(){
Node p=headNode.node;
for(int i=1;i<=theSize;i++){
System.out.println(i+" "+p.data);
p=p.node;
}
}
/**
* �Ѹ���������
* ��������Ϊ 3->7->10 , ���ú��Ϊ 10->7->3
*/
public void reverse(){
Node a,temp;
Node c=new Node(null,null); //����һ���µ�ͷ��㡣
a=headNode;
temp=c;
for(int j=0;j<size();j++){
for(int i=1;i<=size()-j;i++){
a=a.node;
}
// for(int m=size()-j;m<size();m++){
// c=c.node;
// System.out.println(c.data);
// }
temp.node=a;
temp=temp.node;
// System.out.println(temp.data);
a=headNode;
}
a.node=c.node;
}
/**
* ɾ��һ���������ǰ�벿��
* ���磺list = 2->5->7->8 , ɾ���Ժ��ֵΪ 7->8
* ���list = 2->5->7->8->10 ,ɾ���Ժ��ֵΪ7,8,10
*/
public void removeFirstHalf(){
Node p;
p=headNode;
int j=size();
for(int i=1;i<=((size()/2)+1);i++){ //�������м�ڵ㴦
p=p.node;
}
headNode.node=p; //��ͷ����nodeָ���м�ڵ�.
theSize=theSize-(j/2);
}
/**
* �ӵ�i��Ԫ�ؿ�ʼ�� ɾ��length ��Ԫ�� �� ע��i��0��ʼ
* @param i
* @param length
*/
public void remove(int i, int length){
for(int j=0;j<length;j++){
remove(i-1);
}
}
/**
* �ٶ���ǰ�����listB���������������е�����
* �ӵ�ǰ������ȡ����ЩlistB��ָ����Ԫ��
* ���統ǰ���� = 11->101->201->301->401->501->601->701
* listB = 1->3->4->6
* ���صĽ��Ӧ����[101,301,401,601]
* @param list
*/
public int[] getElements(MyLinkedList list){
int[] arr1=new int[list.size()]; //�����洢���صĽ��
int[] arr2=new int[list.size()]; //�����洢list���ϵ��е���
Node p,q;
p=list.getHeadNode();
q=headNode;
for(int i=1;i<=list.size();i++){ //����list����
p=p.node;
arr2[i-1]=(int) p.getDate(); //ȡ�������е��������洢��arr2�С�
}
// for(int i=0;i<arr2.length;i++){
// System.out.println(arr2[i]);
// } //��list��ȡ�����ݡ�
for(int i=0;i<arr2.length;i++){
for(int j=1;j<=arr2[i];j++){
q=q.node;
}
arr1[i]=(int) q.data;
q=headNode;
}
return arr1;
}
/**
* ��֪�����е�Ԫ����ֵ�����������У����Ե��������洢�ṹ��
* �ӵ�ǰ��������ɾ����listB�г��ֵ�Ԫ��
* @param list
*/
public void subtract(MyLinkedList list){
int[] arr=new int[list.size()]; //�����洢list���ϵ��е���
Node p,q;
p=list.getHeadNode();
q=headNode;
for(int i=1;i<=list.size();i++){ //����list����
p=p.node;
arr[i-1]=(int) p.getDate(); //ȡ�������е��������洢��arr�С�
}
//ÿ����һ���������ݣ��ͱ���һ�鱾���������������Ƿ������ͬ�����ݣ���ͬ��ɾ����
for(int i=0;i<arr.length;i++){//��������
for(int j=1;j<=size();j++){//����������
q=q.node;
if((int)q.data==arr[i]){
remove(j);
}
}
q=headNode;
}
}
/**
* ��֪��ǰ�����е�Ԫ����ֵ�����������У����Ե��������洢�ṹ��
* ɾ����������ֵ��ͬ�Ķ���Ԫ�أ�ʹ�ò���������Ա�������Ԫ�ص�ֵ������ͬ��
*/
public void removeDuplicateValues(){
Node q,p;
q=headNode;
for(int i=1;i<=size();i++){
q=q.node;
p=q.node;
if((int)q.data==(int)p.data){
remove(i);
}
}
}
/**
* ��֪�����е�Ԫ����ֵ�����������У����Ե��������洢�ṹ��
* ��дһ��Ч���㷨��ɾ����������ֵ����min��С��max��Ԫ�أ������д���������Ԫ�أ�
* @param min
* @param max
*/
public void removeRange(int min, int max){
int mMax=0,mMin=0;
Node p,q;
q=headNode;
p=headNode;
//�Ӵ���С�ң���һ�α�minС������������β����ʼ��
int[] arr=new int[size()]; //�����洢��������е���
Node m;
m=headNode;
for(int i=1;i<=size();i++){ //����list����
m=m.node;
arr[i-1]=(int) m.getDate(); //ȡ�������е��������洢��arr�С�
}
for(int i=arr.length-1;i>=0;i--){
//System.out.println("arr"+arr[i]);
//System.out.println("arr"+arr[i]);
if(min>arr[i]){
mMin=i+1;
System.out.println("mMix"+mMin);
break;
}
}
//��С�����ң���һ�α�max�������������ͷ����ʼ��
for(int i=1;i<=size();i++){
q=q.node;
if(max<(int)q.data){
mMax=i;
System.out.println("mMax"+mMax);
break;
}
}
//�ҵ�Ҫɾ������
remove(mMin, mMax-mMin);
}
/**
* ���赱ǰ����Ͳ���listָ�����������Ԫ����ֵ�����������У�ͬһ���е�Ԫ��ֵ������ͬ��
* ��Ҫ������������C����Ԫ��Ϊ��ǰ�����list��Ԫ�صĽ������ұ�C�е�Ԫ������ֵ������������
* @param list
*/
public MyLinkedList intersection( MyLinkedList list){
Node p=headNode,
q=list.headNode;
MyLinkedList ls=new MyLinkedList();
for(int i=1;i<size();i++){
p=p.node;
for(int j=1;j<size();j++){
q=q.node;
if((int)p.data==(int)q.data){
ls.add(q.data);
}
}
q=list.headNode;
}
return ls;
}
}