Avatar billede frankedrengen Nybegynder
12. september 2014 - 23:24 Der er 7 kommentarer og
1 løsning

LinkedList opgave

Hej, har skrevet en metode til min egen LinkedList classe, metoden skal udskifte hvert par af noder, med en node, som har den samlet værdi fra de to noder lagt sammen.
Metoden virker når der er ulige antal noder, men ved lige antal kan jeg ikke få fjernet den sidste node?

    // post: replaces every pair of elements in the list with a single element
    // equal to the sum of the pair
    public void compress() {
        ListNode current = front;
       
        while (current.next != null) {
            current.data = current.data + current.next.data;
            if (current.next.next != null) {
                current.next = current.next.next;           
            }
            current = current.next;
        }
    }
Avatar billede arne_v Ekspert
15. september 2014 - 04:21 #1
Kan du ikke bare droppe den if?
Avatar billede frankedrengen Nybegynder
15. september 2014 - 13:34 #2
Hej arne_v, nej det er desværre ikke løsningen. Nu blandes parrene, så det sidste tal i par (n), bliver laget sammen med det første tal i par (n+1), samt det sidste tal i listen er stadig ikke blevet fjernet.....?
Avatar billede arne_v Ekspert
15. september 2014 - 15:10 #3
hvis du fjerner if'en men ikke fjerner linien inden i if'en?
Avatar billede frankedrengen Nybegynder
15. september 2014 - 17:32 #4
Hej igen, Nope det virker ikke, har prøvet lidt frem og tilbage, men får en null-pointer. Dette er hvad metoden gerne skulle returnere:
hvis jeg kalder metoden med [1,2,3,4] skal den give [3,7]
og hvis jeg kalder med [1,2,3,4,5] skal den give [3,7,5]
Avatar billede arne_v Ekspert
15. september 2014 - 17:46 #5
hvad med:

        while (current != null && current.next != null) {
            current.data = current.data + current.next.data;
            current.next = current.next.next;         
            current = current.next;
        }
Avatar billede frankedrengen Nybegynder
15. september 2014 - 22:00 #6
Hej arne_v, ja nu køren den. Mange tak for hjælpen. Håber det hjælper på min forståelse når jeg for nærlæst koden.
drop et svar!
Avatar billede arne_v Ekspert
15. september 2014 - 23:53 #7
svar
Avatar billede arne_v Ekspert
17. september 2014 - 01:49 #8
Jeg saa dit spergsmaal foer dette.

Og det var lidt trist, fordi jeg maatte erkende, at jeg ikke laengere er i stand til at hjaelpe med den slags spoergsmaal. Jeg goer simpelthen tingene for anderledes.

Hvis du vil se en anden tilgang til problemstillingen, saa se foelgende:


public class LinkedList<T> {
    private static class ListNode<T> {
        public ListNode<T> next;
        public T data;
        public ListNode(T data, ListNode<T> next) {
            this.data = data;
            this.next = next;
        }
        @Override
        public String toString() {
            return data.toString();
        }
    }
    @FunctionalInterface
    private static interface NodeAggregator<T,TR> {
        public TR aggregate(TR prevval, ListNode<T> node);
    }
    @FunctionalInterface
    private static interface NodeProcessor<T> {
        public void process(ListNode<T> node);
    }
    @FunctionalInterface
    private static interface NodePairProcessor<T> {
        public void process(ListNode<T> node1, ListNode<T> node2);
    }
    @FunctionalInterface
    private static interface Combiner<T> {
        public T combine(T val1, T val2);
    }
    private ListNode<T> head;
    private void insertAfter(ListNode<T> prevnode, T data) {
        prevnode.next = new ListNode<T>(data, prevnode.next);
    }
    private void removeAfter(ListNode<T> prevnode) {
        prevnode.next = prevnode.next.next;
    }
    private ListNode<T> last() {
        ListNode<T> curr = head;
        while(curr.next != null) {
            curr = curr.next;
        }
        return curr;
    }
    private <TR> TR aggregateAll(TR initial, NodeAggregator<T,TR> aggr) {
        TR result = initial;
        ListNode<T> curr = head;
        while(curr != null) {
            result = aggr.aggregate(result, curr);
            curr = curr.next;
        }
        return result;
    }
    private void processAll(NodeProcessor<T> proc) {
        ListNode<T> curr = head;
        while(curr != null) {
            ListNode<T> next = curr.next; // to handle the case where curr.next gets modified by the processor
            proc.process(curr);
            curr = next;
        }
    }
    private void processAll(NodePairProcessor<T> proc) {
        ListNode<T> curr = head;
        while(curr != null && curr.next != null) {
            ListNode<T> next = curr.next.next; // to handle the case where curr.next.next gets modified by the processor
            proc.process(curr, curr.next);
            curr = next;
        }
    }
    public LinkedList() {
        head = null;
    }
    public void append(T data) {
        if(head == null) {
            head = new ListNode<T>(data, null);
        } else {
            insertAfter(last(), data);
        }
    }
    @Override
    public String toString() {
        return "{" + aggregateAll("", (prevval,node) -> prevval + " " + node.toString()) + " }";
    }
    public void stretch(final int n) {
          processAll(node -> { for(int i = 1; i < n; i++) insertAfter(node, node.data); });
    }
    public void compress(Combiner<T> comb) {
        processAll((node1, node2) -> { node1.data = comb.combine(node1.data, node2.data); removeAfter(node1); } );
    }
    public static void main(String[] args) {
        LinkedList<Integer> lst = new LinkedList<Integer>();
        lst.append(2);
        lst.append(4);
        lst.append(6);
        System.out.println(lst);
        lst.stretch(3);
        System.out.println(lst);
        lst.compress((val1, val2) -> val1 + val2);
        System.out.println(lst);
    }
}


Noter:
* jeg vil bestemt fraraade dig at aflevere noget som dette - det vil signalere fusk
* det er kodet til Java 8, men kan nemt konverteres til aeldre Java versioner
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester