Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java
Войти
Регистрация
Восстановить пароль
 
P1one
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 1
1

DoublyLinkedList

14.05.2017, 15:52. Просмотров 160. Ответов 3

Задание: Используя динамическую структуру список, сохранить ряд чисел.Удалить элементы, которые повторяются
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//класс, реализующий список
 
package q;
 
public class Link {
int data;
Link next;
Link prev;
 
public Link(){
data=0;
next = null;
prev = null;
}
public Link(int value){
data = value;
next = null;
prev = null;
}
public void DisplayLink(){
System.out.print(data+" ");
}
}
//класс, реализующий методы работы со списком
package q;
import java.util.*;
public class DoublyLinkedList {
private static Link first;
private Link last;
 
public DoublyLinkedList(){
first = null;
last = null;
}
 
public boolean IsEmpty(){
return first == null;
}
//метод, вставляющий элемент в конец списка
public void InsertLast(int dd){
Link newLink = new Link(dd);
if(IsEmpty())
    first = newLink;
else {last.next = newLink;
newLink.prev = last;
}
last = newLink;
}
//метод удаляющий первое вхождение переменной key
public Link deleteKey(int key){
 Link current = first; 
 while (current.data != key)
 {
 current = current.next;
 if (current == null)
 return null; //такий елемент не знайдений
 }
 
 if (current == first) //знайдений, перший вузол
 first = current.next; 
 else
 current.prev.next = current.next;
 if (current == last) // останній вузол?
 last = current.prev; 
 else
 // not last
 current.next.prev = current.prev;
 return current; // return value
 }
 
 
 
//метод выводит на экран
public void DisplayForward(){
System.out.print("Список:");
Link current = first;
while(current !=null){
    current.DisplayLink();
    current = current.next;
 
}
System.out.println("");
}
 
public static void main(String[]args){
DoublyLinkedList list = new DoublyLinkedList();
Random r = new Random();
int n = r.nextInt(20)+10;
int k=0;
for(int i=0;i<n;i++){
    list.InsertLast(r.nextInt(20)-10);
    k++;}
list.DisplayForward();
 
System.out.println("Удаляем все лишнее");
 
list.DisplayForward();
}
}
Насколько я понимаю, нужно создать некий логический метод, определяющий есть ли в списке копии элементов, и потом в мейне через цикл пройтись по списку, для каждого элемента вызывая этот метод, и если он вернет true?то использовать метод DeleteKey, удаляющий элемент. Вся проблема в том, что не могу никак додуматься, как написать этот логический метод правильно(а может решение будет другое совсем)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2017, 15:52
Ответы с готовыми решениями:

Поиск объекта в DoublyLinkedList
Добрый день! Решил изучить синтаксис PHP с ООП(знаком с ООП на Java), но сразу наткнулся на камень....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
xoraxax
1343 / 1285 / 378
Регистрация: 05.07.2013
Сообщений: 6,172
Завершенные тесты: 1
14.05.2017, 23:46 2
идешь по листу, если текущей элемент содержится в Set, удалить элемент, иначе добавить текущий элемент в сет.
0
we2seek
80 / 80 / 42
Регистрация: 25.01.2010
Сообщений: 385
15.05.2017, 01:17 3
Java
1
2
List<Integer> duplicates = Arrays.asList(1, 2, 2, 3, 3, 3, 4);
List<Integer> unique = duplicates.stream().distinct().collect(Collectors.toList());
0
v777779
160 / 167 / 138
Регистрация: 28.11.2016
Сообщений: 301
15.05.2017, 07:19 4
Добавлен метод getKey() в class Link
и методы clone() и removeDoubles() в DoublyLinkedList
Основная идея удалить из списка все повторы ключа, а ключ перенести в новый список.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Link {
    int data;
    Link next;
    Link prev;
 
    public Link() {
        data = 0;
        next = null;
        prev = null;
    }
 
    public Link(int value) {
        data = value;
        next = null;
        prev = null;
    }
 
    public int getKey() {
        return data;
    }
    public void DisplayLink() {
        System.out.print(data + " ");
    }
 
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
public class DoublyLinkedList {
 
    private Link first;
    private Link last;
 
    public DoublyLinkedList() {
        first = null;
        last = null;
    }
 
    public boolean IsEmpty() {
        return first == null;
    }
 
    //метод, вставляющий элемент в конец списка
    public void InsertLast(int dd) {
        Link newLink = new Link(dd);
        if (IsEmpty())
            first = newLink;
        else {
            last.next = newLink;
            newLink.prev = last;
        }
        last = newLink;
    }
 
    public void InsertLast(Link newLink) {
        if (IsEmpty())
            first = newLink;
        else {
            last.next = newLink;
            newLink.prev = last;
        }
        last = newLink;
    }
 
    //метод удаляющий первое вхождение переменной key
    public Link deleteKey(int key) {
        Link current = first;
        while (current.data != key) {
            current = current.next;
            if (current == null)
                return null; //такий елемент не знайдений
        }
 
        if (current == first) //знайдений, перший вузол
            first = current.next;
        else
            current.prev.next = current.next;
        if (current == last) // останній вузол?
            last = current.prev;
        else
            // not last
            current.next.prev = current.prev;
        return current; // return value
    }
 
    public DoublyLinkedList clone() {
        DoublyLinkedList list = new DoublyLinkedList(); //новый список
        Link link = this.first;
 
        while (true) {
            list.InsertLast(link.getKey());
            if (link == last) {
                break;
            }
            link = link.next;
        }
        return list;
    }
 
    public DoublyLinkedList removeDoubles() {
        DoublyLinkedList sList = this.clone(); //клонируем
        DoublyLinkedList dList = new DoublyLinkedList(); //новый список
 
        while (true) {
            int key = sList.first.getKey();
            while (!sList.IsEmpty() && sList.deleteKey(key) != null) { // удалять все похожие элементы
            }
            dList.InsertLast(key);
            if (sList.IsEmpty()) { // закончили
                break;
            }
        }
        return dList; // return dList
    }
 
    //метод выводит на экран
 
    public void DisplayForward() {
        System.out.print("Список:");
        Link current = first;
        while (current != null) {
            current.DisplayLink();
            current = current.next;
        }
        System.out.println("");
    }
 
    public static void main(String[] args) {
        DoublyLinkedList list = new DoublyLinkedList();
        Random r = new Random();
        int n = r.nextInt(20) + 10;
        int k = 0;
        for (int i = 0; i < n; i++) {
            list.InsertLast(r.nextInt(20) - 10);
            k++;
        }
        list.DisplayForward();
 
        System.out.println("Удаляем все лишнее");
        list = list.removeDoubles();
        list.DisplayForward();
     
    }
 
}
0
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru