מוגדרת "רשימה דו-כיוונית" כאוסף סדור של חוליות BinNode Integer המקושרות כך שלכל זוג חוליות p1,p2: אם p1.getRight()==p2 אז p2.getLeft()==p1 (יש לפחות שתי חוליות). כלומר כל חוליה — חוץ מהחוליה שבקצה הימני והחוליה שבקצה השמאלי — מצביעה על החוליה שלפניה ועל החוליה שלאחריה. בדוגמה שבשאלון: הרשימה 13-10-27-11-8 (null בקצה שמאל, null בקצה ימין), ומשתנה pos מצביע על החוליה עם הערך 11.
public class BinNode<T> {
private T value;
private BinNode<T> left; // ברשימה דו-כיוונית: החוליה השמאלית (הקודמת)
private BinNode<T> right; // ברשימה דו-כיוונית: החוליה הימנית (הבאה)
public BinNode(T value) { this.value = value; this.left = null; this.right = null; }
public T getValue() { return value; }
public void setValue(T value) { this.value = value; }
public BinNode<T> getLeft() { return left; }
public void setLeft(BinNode<T> left) { this.left = left; }
public BinNode<T> getRight() { return right; }
public void setRight(BinNode<T> right) { this.right = right; }
}
// "רשימה דו-כיוונית": לכל זוג חוליות p1,p2 — אם p1.getRight()==p2 אז p2.getLeft()==p1.
הרשימה הדו-כיוונית שבדוגמה, pos מצביע על החוליה עם הערך 11
null <- [13] <-> [10] <-> [27] <-> [11] <-> [8] -> null
^pos
הפעולה firstLeft מקבלת מצביע pos שונה מ-null מטיפוס BinNode<Integer> המצביע על חוליה כלשהי ברשימה דו-כיוונית ומחזירה את החוליה השמאלית ביותר ברשימה. הפעולה firstRight מקבלת מצביע pos שונה מ-null מטיפוס BinNode<Integer> המצביע על חוליה כלשהי ברשימה דו-כיוונית ומחזירה את החוליה הימנית ביותר ברשימה.
לסעיף ב — לפניך הפעולה what(BinNode<Integer> pos) המקבלת מצביע לחוליה כלשהי ברשימה דו-כיוונית ומחזירה ערך בוליאני. הרשימה הדו-כיוונית מכילה לפחות 3 חוליות.
public static boolean what(BinNode<Integer> pos)
{
BinNode<Integer> left = firstLeft(pos);
BinNode<Integer> right = firstRight(pos);
int sum = left.getValue() + right.getValue();
left = left.getRight();
right = right.getLeft();
while ((left != right) && (left.getRight() != right) &&
(left.getValue() + right.getValue() == sum))
{
left = left.getRight();
right = right.getLeft();
}
if (left == right)
return right.getValue() == sum;
if (left.getRight() == right)
return left.getValue() + right.getValue() == sum;
return false;
}
«השורות המוקפות במסגרת» הן שלוש השורות האחרונות בפעולה: מ-if (left.getRight() == right) ועד return false;.
לפניך שלד הפעולה firstLeft המקבלת pos שונה מ-null מטיפוס BinNode<Integer> המצביע על חוליה כלשהי ברשימה דו-כיוונית, ומחזירה את החוליה השמאלית ביותר ברשימה. העתק את השלד למחברתך והשלם אותו כך שהפעולה תבצע את הנדרש.
public static BinNode<Integer> firstLeft(BinNode<Integer> pos)
עקוב אחר ביצוע הפעולה what(pos) בעבור המשתנה pos והרשימה הדו-כיוונית שבדוגמה שהוצגה בתחילת השאלה. במעקב הראה את ערכי המשתנים pos, left, right, sum.
קבע אם אפשר או אי אפשר להחליף את 3 השורות האחרונות שבפעולה — השורות המוקפות במסגרת — בהוראה: return left.getValue()+right.getValue()==sum;. נמק את קביעתך.
שאלות ותגובות על השאלה
🎓 לא הבנתם משהו? קבלו הסבר נוסף ממרצה לתכנות
שאלו כאן — ותקבלו מענה מוסמך.