---我的节点类---
class Node<E> {
public E data;
public Node<E> next;
Node(E data, Node<E> next)
{
this.data = data;
this.next = next;
}
}
---我的神秘方法正在影响我的名单---
public Node < E > mystery < E extends Comparable > (Node < E > first, E x) {
Node < E > p2 = null;
Node < E > p1 = first;
while (p1 != null && x.compareTo(p1.data) != 0) {
p2 = p1;
p1 = p1.next;
}
if (p1 != null) {
if (p1 == first) {
first = first.next;
} else {
p2.next = p1.next;
}
}
return first;
}
我尝试将“神秘”方法转换为“伪代码”,以便更好地理解它。但我仍然不明白它在做什么。
- 我的伪代码 -
-----While loop------
While p1 is not null/empty, and while x is not equal to p1
Set p2 equal to p1
and set p1 equal to p1.next
----If Statements------
if p1 is not empty/null and if p1 is equal to the first item in the list
then set first to first.next (moving the pointer)
if none of the above is able to be ran
then set p2.next equal to p1.next
and return first.
我的列表看起来像这样...... ptr [] - &gt; [10] [] - &gt; [20] [] - &gt; [30] [] - &gt; [40] [] - &gt; [50] [Ø]
我需要了解我的神秘方法究竟做了什么,并且能够看到如果这样的事情被称为列表会发生什么:ptr = mystery(ptr,50);
任何帮助都会很棒。我已经坚持了一段时间了......谢谢你。
答案 0 :(得分:1)
Node < E > p2 = null; Node < E > p1 = first; while (p1 != null && x.compareTo(p1.data) != 0) { p2 = p1; p1 = p1.next; }
这意味着:遍历链表中的元素,直到:
x
p1
包含元素,p2
是p1
之前的节点x
的元素)
p1
为null
if (p1 != null) { if (p1 == first) { first = first.next; } else { p2.next = p1.next; } } return first;
会发生什么:
p1
为null
,则表示元素x
不在链接列表中。 if
失败,方法返回first
未更改p1
不是null
,则表示找到了元素x
,其中包含p1
p1
是first
节点,则返回第二个节点p2.next
指向p1.next
,然后返回第一个节点简而言之:该方法搜索包含x
的节点,如果找到它,则删除它。
该方法返回第一个节点,或者如果它被删除则返回第二个节点。