我正在编写一个方法removeEvens,它从列表中删除偶数索引中的值,返回一个包含原始顺序的值的新列表。这笔交易是我正在实现我自己的链表,我不能使用java.util
中的LinkedList。
例如,如果变量list1
存储这些值:
**list1: [8, 13, 17, 4, 9, 12, 98, 41, 7, 23, 0, 92]**
And the following call is made:
**LinkedIntList list2 = list1.removeEvens();**
After the call, list1 and list2 should store the following values:
**list1: [13, 4, 12, 41, 23, 92]
list2: [8, 17, 9, 98, 7, 0]**
该方法位于此链接列表类:
public class LinkedIntList {
private ListNode front; // null for an empty list
...
}
ListNode类中的字段:
public int data; // data stored in this node
public ListNode next; // link to next node in the list
我的代码(已更新):
public LinkedIntList removeEvens(){
LinkedIntList b = new LinkedIntList();
b.front = front;
if(front == null) {
System.out.println("The list inputed it empty");
}
else {
ListNode even = b.front;
while(even!=null && even.next!=null ) {
int toBeAdded = even.next.data;
even.next = even.next.next;
add(toBeAdded);
even = even.next;
}
}
return b;
}
我的输出:
更新输出:
似乎我已将偶数索引的值存储在新列表(list2)中,但如何将(奇数索引的)剩余值存储在原始列表(list1)中?
答案 0 :(得分:2)
解决这个问题的一种方法是返回一个LinkedIntList类型的List,然后以这种二维方式返回两个列表(一个用于奇数,一个用于偶数),如下所示:
public List<LinkedIntList> removeEvens(){
List<LinkedIntList> 2dOutput = new ArrayList<>();
LinkedIntList odd = new LinkedIntList();
LinkedIntList even = new LinkedIntList();
ListNode temp = front;
even.front=temp;
if(front == null) {
System.out.println("The list inputed is empty");
}else if(front.next == null){
odd.front = null;
front = null;
}else {
ListNode current =front.next;
odd.front = current;
while(temp != null){
current.next = current.next.next;
current = current.next;
temp.next = temp.next.next;
temp = temp.next;
}
}
2dOutput.add(even);
2dOutput.add(odd);
return 2dOutput;
}
值得注意的是,我没有测试过这个,但我很确定这会成功地将两者分开。
我不确定你在最后发布的输出字段是什么,所以无论它是什么,都可能要你格式化它有点不同。
祝你好运!答案 1 :(得分:2)
我假设您在LinkedIntList类中有addTail(),以在列表的末尾添加一个新节点。
您的代码看起来像这样。没试过,但它应该有效。
public LinkedIntList removeEvens(){
LinkedIntList b = new LinkedIntList();
if(front == null) {
System.out.println("The list inputed it empty");
}
else {
ListNode current = front.next; // current node always points to an odd node
b.addTail(front); // add first node (even) to list
front = current: // front now points to first odd node.
// while there is odd node and the next node (even node) is not null
while(current!=null && current.next != null) { // need to remove even node
ListNode toBeAdded = current.next; // save the node to be removed
current.next = current.next.next;
b.addTail(toBeAdded);
current = current.next;
}
}
size -= b.size(); // new list size is old list size minus total removed nodes.
return b;
}
答案 2 :(得分:1)
您需要更改节点中元素之间的链接,并确保“奇数”列表中的第一个元素与偶数列表中的第一个元素不同。
最初你有:
1 -> 2 -> 3 -> 4
要拥有两个单独的节点列表:
1
和2
1->3
和2->4
答案 3 :(得分:1)
这是经过测试的问题代码。 在这里,当你打电话删除evens。列表将仅包含evens,而新列表b将仅包含奇数
公共类LinkedIntList { 私有ListNode前端;
public LinkedIntList removeEvens()
{
LinkedIntList b = new LinkedIntList();
ListNode temp = front;
int count=0;
ListNode evenPrev=null;
ListNode oddLast=null;
while(temp!=null)
{
if(count%2==0)
{
evenPrev=temp;
temp=temp.next;
}
else
{
if(oddLast==null)
{
b.front=temp;
oddLast=temp;
}
else
{
oddLast.next=temp;
oddLast=oddLast.next;
}
evenPrev.next=temp.next;
temp=temp.next;
oddLast.next=null;
}
count++;
}
return b;
}
public void display()
{
ListNode temp=front;
while(temp!=null)
{
System.out.println(temp.data);
temp=temp.next;
}
}
public static void main(String []args)
{
LinkedIntList a=new LinkedIntList();
ListNode aLast=null;
for(int i=0;i<11;i++)
{
ListNode temp=new ListNode();
temp.data=i;
if(a.front==null)
{
a.front=temp;
aLast=temp;
}
else
{
aLast.next=temp;
aLast=aLast.next;
}
}
a.display();
LinkedIntList b=a.removeEvens();
a.display();
b.display();
}
}
类ListNode
{
公共数据; //存储在此节点中的数据
public ListNode next; //链接到列表中的下一个节点
}
答案 4 :(得分:0)
试试这个:
public LinkedIntList removeEvens () {
LinkedIntList list2 = new LinkedIntList();
for (int i = 0; i < size(); i++) {
list2.add(get(i));
remove(i);
}
return list2;
}