对于编程方面的挑战,我需要编写一种方法来删除链表的中间节点,前提是该链表的节点数为奇数。如果存在,它将在中间节点中返回信息;否则为null。
例如,如果列表为a-> b-> c-> d-> e,则删除c。如果列表是a-> b-> c-> d,则不会删除任何内容。挑战禁止使用计数器变量或布尔值。
我知道只需使用一个循环即可解决该问题。我知道我应该使用一个临时节点来完成循环,但是我不确定如何进行。我在不使用计数器的情况下检查列表中节点的数量有麻烦,并且想不出如何将指针移到中间的节点。
public class DynamicNode {
// the data in the node
private Object info;
// refers to the next node on the list
private DynamicNode next;
/**
* Each time an object of type DynamicNode is instantiated, the constructor places the object
* being stored in the node into the info field and "points" the next field to the next node in
* the list.
*/
public DynamicNode(Object x, DynamicNode n) {
info = x;
next = n;
}
/**
* Extracts the object stored in the node.
*/
public Object getInfo() {
return info;
}
/**
* "Points" to the node following the current node.
*/
public DynamicNode getNext() {
return next;
}
/**
* Inserts the object into the node.
*/
public void setInfo(Object x) {
info = x;
}
/**
* Sets the next field to the next node in the list.
*/
public void setNext(DynamicNode n) {
next = n;
}
public String toString() {
return info.toString();
}
}
class DynamicList {
/**
* Head of the list.
*/
private DynamicNode head;
/**
* Instantiates a new list and initializes its head pointer to null.
*/
public DynamicList() {
head = null;
}
public DynamicList(DynamicNode head) {
this.head = head;
}
/**
* Gets the head of the list.
*/
public DynamicNode getList() {
return head;
}
// The problem!
public Object deleteMid() {
}
}
答案 0 :(得分:2)
两个从头开始的指针。
在列表中将一个指针向上移动一个,将另一个指针向上移动两个。
如果两次向上移动的指针为NULL,则您没有奇数链接列表。
如果向上移动两次的指针的next
字段为NULL,则移动较慢的指针将位于中间节点。
尝试在一张纸上进行追踪,并列出不同长度的清单。您会看到它是如何工作的。
答案 1 :(得分:0)
使用两个指针。 其中一个节点每次进展一个,其他节点两次进展。 如果您在尝试加快速度时发现指针,则无法前进两次,这意味着列表中的节点数为奇数。返回较慢的指针数据。否则,返回null。