问题
I am writing an program in which i have to set up data structure dictionary(singly linked list) with words alphabetically ordered(words that appear in sentence in a text document with document ids). and find which words appear in more than one document so the professor wants us to do an intersection. I am really confused on how to do the intersection. I have everything else(Which I believe is correct). Here is my code(I have added my intersect algorithm, but it is clearly not working and I followed the professors algorithm[she never shows us an example]):
public class dictionary
{
//variables
dNode head;
int size;
//constructor
public dictionary()
{
head = null;
size = 0;
}
//addFirst method
public void addFirst(dNode s)
{
s.setNext(head);
head = s;
size++;
}
public void addLast(dNode s)
{
if ( head == null )
{
head = s;
}
else
{
s.setNext(null);
dNode w = head;
while ( w.getNext() != null )
{
w = w.getNext();
}
w.setNext(s);
}
size++;
}
//toString Method
public String toString()
{
String w = "";
dNode s = head;
while ( s != null )
{
w += s + "\n";
s = s.getNext();
}
return w;
}
//intersection method
public String intersection(pNode head, dNode head) {
int left = posting.head;
int right = dictionary.head;
int result = new dictionary();
while (left != null && right != null) {
if (dID.left < dID.right) {
left = left.next;
else if (dID.left > dID.right)
right = right.next;
else
left = left.next;
right = right.next;
result.push(left.data() );
}
}
return result;
}
}
public class dNode
{
//variables
String sent;
posting post;
dNode nextNode;
//constructor
public dNode(String sent, posting post, dNode nextNode)
{
this.sent = sent;
this.post = post;
this.nextNode = nextNode;
}
//returns element of this node
public String getSent() {
return sent;
}
//retunrs the next node of this node
public dNode getNext() {
return nextNode;
}
//modifier methods
//sets elements of this node.
public void setSent(String newSent) {
sent = newSent;
}
//sets the next node of this node
public void setNext( dNode newNext) {
nextNode = newNext;
}
//toString method
public String toString()
{
return "Sentence and Posting: \n" + sent + "\n" + post;
}
}
public class pNode {
//variables
int dID;
String word;
int occurence;
pNode next;
//constructor
public pNode(int dID, String word, int occurence, pNode next)
{
this.dID = dID;
this.word = word;
this.occurence = occurence;
this.next = next;
}
//return element of this node
public String getWord() {
return word;
}
//Returns the next node of this node
public pNode getNext() {
return next;
}
//Modifier methods
//set the words of this node
public void setWord(String newWord) {
word = newWord;
}
//sets the next node of this node
public void setNext(pNode newNext){
next = newNext;
}
//toString method
public String toString() {
return "Document ID, Word, Occurence: \n " + dID + ", "
+ word + ", " + occurence;
}
}
public class posting
{
//variables
pNode head;
int size;
//constructor
public posting()
{
head = null;
size = 0;
}
//addFirst method
public void addFirst(pNode s)
{
s.setNext(head);
head = s;
size++;
}
//addLast method
public void addLast(pNode s)
{
if ( head == null )
{
head = s;
}
else
{
s.setNext(null);
pNode w = head;
while ( w.getNext() != null )
{
w = w.getNext();
}
w.setNext(s);
}
size++;
}
//toString method
public String toString()
{
String w = "";
pNode s = head;
while ( s != null)
{
w += s + "\n";
s = s.getNext();
}
return w;
}
}
import java.io.*;
import java.util.*;
public class testFile
{
public static void main (String[] args) throws FileNotFoundException
{
File filename = new File("/export/home/hawkdom2/s0878044/CS503/assignment2/sentences.txt");
Scanner scan = new Scanner(filename);
dictionary Dictionary = new dictionary();
while ( scan.hasNextLine() )
{
String sentence = scan.nextLine();
String[] word = sentence.split(" ");
//first element is document id
int dID = Integer.parseInt( word[0] );
//insertion sort
for ( int i = 2; i < word.length; i++ )
{
for ( int j = i; j > 1; j-- )
{
if ( word[j].compareTo( word[j-1] ) > 0 )
{
String switchs = word[j];
word[j] = word[j-1];
word[j-1] = switchs;
}
}
}
//integer array count
int[] count = new int[word.length];
for ( int i = 1; i < word.length; i++)
{
for ( int j = 1; j < word.length; j++)
{
if (word[i].equalsIgnoreCase( word[j] ) )
{
count[i]++;
}
}
}
posting posts = new posting();
for ( int i = 1; i < word.length; i++ )
{
if ( (i > 1 ) && (word[i].equalsIgnoreCase( word[i-1] ) ) )
continue;
else
{
posts.addFirst(new pNode(dID, word[i], count[i], null) );
}
}
Dictionary.addLast(new dNode(sentence, posts, null) );
}
//print out output
System.out.println(Dictionary);
}
}
This is the sentences file:
1 a rose is a rose
2 John chased a cat and the cat chased John
3 cats are mammals but mammals are not cats
4 beavers build dams but i know a beaver that does not
5 my dog chased a cat and the cat attacked my dog
6 my dog likes cats but my cat dislikes dogs
7 my dog likes roses but roses dislike my dog
8 my cat dislikes roses but roses like my cat
9 red roses are not my favorite roses
10 my favorite roses are pink roses
If I could get some insight on how to intersect the two linked lists(or if there is anything else wrong with my program) I would really greatly appreciate it. I have been sick for the last week and my professor refuses to help me on what I missed(apparently I am not a serious programmer if I don't come to class when I 'm sick). I really cannot stand the way this professor teaches this class because she doesn't give us any examples of the programs(and the very few she does give us always have errors). She also just gives us algorithms and she's already stated, they are not always correct. I used to love programming but she has really turned me off on it and all I am trying to do now is get at least a C so I can just switch over to IT. I would really appreciate if someone can help me, I am desperate to just get done with this class and not have to take this professor ever again.
I adding an intersect method but am still receiving all these errors: 7 errors found: File: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java [line: 86] Error: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java:86: illegal start of expression File: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java [line: 86] Error: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java:86: ';' expected File: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java [line: 86] Error: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java:86: not a statement File: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java [line: 86] Error: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java:86: ';' expected File: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java [line: 86] Error: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java:86: not a statement File: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java [line: 86] Error: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java:86: ';' expected File: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java [line: 96] Error: /export/home/hawkdom2/s0878044/CS503/assignment2/testFile.java:96: 'else' without 'if'
回答1:
public static void findIntersection(LLNode head1, LLnode head2)
{
HashSet<LLNode> hs= new HashSet<>();
HashSet<LLNode> hs2 = new HashSet<>();
LLNode currentNode1 = head1;
while(currentNode.getNext()!=null)
{
hs.add(currentNode);
currentNode1 = currentNode1.getNext();
}
LLNode currentNode2 = head2;
while(currentNode2.getNext()!=null)
{
if(hs1.contains(currentNode2)){
hs2.add(currentNode2);
}
}
回答2:
Intersecting two sorted lists is easy.
Start with a pointer to the first node in each list. Let's call them left
and right
. Create a new empty list, let's call it result
. Now you loop, comparing the data stored at the left
and right
nodes:
- If the data at
left
is less, advanceleft
. - If the data at
right
is less, advanceright
. - If the data is equal, add it to
result
and advance bothleft
andright
.
Your loop continues until you read the end of either left
or right
. Now you have intersected the two lists (ie the result
list contains only the elements that appear in both left
and right
).
function intersect( list1, list2 )
left <- list1.head
right <- list2.head
result <- new list
while left != null and right != null
if left.data < right.data
left <- left.next
elseif left.data > right.data
right <- right.next
else
left <- left.next
right <- right.next
result.push(left.data)
end if
end
return result
end function
For the best speeds, either store a tail
pointer in your list (so that addLast
is quick), or always add on the front (so your result is reverse-sorted) and then reverse the list afterwards (a simple operation with linear time-complexity).
回答3:
My version to find intersection of two linked list goes like below: 1. Iterate through first linked list and add element in IdentityHashMap as key. 2. Iterate through second linked list and go for containsKey check. If true then node is intersecting.
Time Complexity: O(n+m) where n = size of first list, m= size of second list Space Complexity: O(n)
来源:https://stackoverflow.com/questions/20183623/how-to-find-intersections-in-two-singly-linked-lists