Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定两个链表,查找其中一个列表是另一个列表的子列表的索引_Java_Algorithm_Data Structures - Fatal编程技术网

Java 给定两个链表,查找其中一个列表是另一个列表的子列表的索引

Java 给定两个链表,查找其中一个列表是另一个列表的子列表的索引,java,algorithm,data-structures,Java,Algorithm,Data Structures,最近,我在大学里参加了一个java编码挑战,有人问我这个问题,我发现这个问题很难实现 问题是要实现一种方法detect,即给定两个LinkedList,返回索引,其中第二个列表是第一个列表的子列表 detect((1,2,3),(2,3)) should return 1 列表的节点结构为 LinkedListNode { String val; LinkedListNode *next; } 和方法签名 static int detect(LinkedListNode list

最近,我在大学里参加了一个java编码挑战,有人问我这个问题,我发现这个问题很难实现

问题是要实现一种方法
detect
,即给定两个
LinkedList
,返回索引,其中第二个列表是第一个列表的子列表

detect((1,2,3),(2,3)) should return 1
列表的节点结构为

LinkedListNode {
   String val;
   LinkedListNode *next;
}
和方法签名

static int detect(LinkedListNode list, LinkedListNode sublist)
解决这个问题的基本算法是什么。我是数据结构的新手。

我相信实现了这一点。您可以查看它的实现。 基本上:

    ListIterator<?> si = source.listIterator();
    nextCand:
        for (int candidate = 0; candidate <= maxCandidate; candidate++) {
            ListIterator<?> ti = target.listIterator();
            for (int i=0; i<targetSize; i++) {
                if (!eq(ti.next(), si.next())) {
                    // Back up source iterator to next candidate
                    for (int j=0; j<i; j++)
                        si.previous();
                    continue nextCand;
                }
            }
            return candidate;
        }
ListIterator si=source.ListIterator();
下一步:

对于(int-candidate=0;candidate,基本思想是遍历第二个列表,并检查第一个列表中连续元素的相等性。以下算法适用于您:

public static void main(String[] args) {
        List<Integer> list1 = new LinkedList<Integer>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        list1.add(5);
        list1.add(6);
        List<Integer> list2 = new LinkedList<Integer>();
        list2.add(2);
        list2.add(3);


        boolean contains = true;
        int currIndex = 0;
        int i = 0,j = 0;
        for(;j<list2.size();j++) {
            int e2 = list2.get(j);
            for(i=currIndex;i<list1.size();i++) {
                if(e2 == list1.get(i)) {
                    break;
                }
            }
            if(i == list1.size()) {
                contains = false;
                break;
            }
            currIndex++;
            if( contains && (currIndex == list2.size()) ) {
                System.out.println("Index is: " + (i-j));
            }
        }
    }
publicstaticvoidmain(字符串[]args){
List list1=新链接列表();
清单1.添加(1);
清单1.添加(2);
清单1.添加(3);
清单1.添加(4);
清单1.添加(5);
清单1.添加(6);
List list2=新链接列表();
清单2.添加(2);
清单2.添加(3);
布尔包含=真;
int currIndex=0;
int i=0,j=0;

对于(;jSince,此处的值为字符串:-

static int find(LinkedListNode list, LinkedListNode sublist) {
    String listString = convertLinkedListToString(list);
    String sublistString = convertLinkedListToString(sublist);
    return listString.indexOf(sublistString);
}

private static String convertLinkedListToString(LinkedListNode list) {
    String listAsString = "";
    while(list != null) {
        listAsString = listAsString + list.val;
        list = list.next;
    }
    return listAsString;
}

那些列表排序了吗?应该
检测((1,2,3,4),(2,3))
还返回1吗?@Manu:是的,它should@PhamTrung:不一定。这看起来像DFS。当我在方法签名中的参数列表上使用Collections.IndexOfPublist时,我收到运行时错误,表示它不适用于节点类型,这是因为LinkedListNode未实现list=>使其实现list或复制粘贴以上算法并根据您的代码进行调整!不要因为答案为您指明了方向而不给您完整的解决方案而对其进行否决。仅供参考,我没有否决您的答案。@roger_我对否决投票的误解。我不知道是谁否决了它,并认为它来自您。对不起。希望JDK是一个lgo将帮助您找到最佳运行时间吗?如果我没有弄错的话,它将更糟O(N*m),N是源的大小,m是目标的大小。
static int find(LinkedListNode list, LinkedListNode sublist) {
    String listString = convertLinkedListToString(list);
    String sublistString = convertLinkedListToString(sublist);
    return listString.indexOf(sublistString);
}

private static String convertLinkedListToString(LinkedListNode list) {
    String listAsString = "";
    while(list != null) {
        listAsString = listAsString + list.val;
        list = list.next;
    }
    return listAsString;
}