java可视化设计给定一个链表的头节点head,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始), 如果链表中存在环 ,则返回 true 。 否则,返回 false 。代码
时间: 2023-07-10 08:12:47 浏览: 100
判断单链表中是否存在环
以下是一个 Java 可视化设计的例子:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LinkedListCycleDetection extends JFrame implements ActionListener {
private JLabel label1, label2, label3;
private JTextField textField1, textField2;
private JButton button;
private JTextArea textArea;
public LinkedListCycleDetection() {
setTitle("LinkedList Cycle Detection");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
JPanel panel = new JPanel(new GridLayout(4, 2));
label1 = new JLabel("Head node:");
textField1 = new JTextField();
label2 = new JLabel("Position of tail node (0-based):");
textField2 = new JTextField();
button = new JButton("Detect");
button.addActionListener(this);
label3 = new JLabel("Result:");
textArea = new JTextArea();
textArea.setEditable(false);
panel.add(label1);
panel.add(textField1);
panel.add(label2);
panel.add(textField2);
panel.add(button);
panel.add(label3);
panel.add(textArea);
add(panel);
setVisible(true);
}
public static void main(String[] args) {
new LinkedListCycleDetection();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
String head = textField1.getText().trim();
if (head.isEmpty()) {
JOptionPane.showMessageDialog(this, "Please enter head node.");
return;
}
int pos;
try {
pos = Integer.parseInt(textField2.getText().trim());
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "Please enter a valid position.");
return;
}
// create linked list
ListNode[] nodes = new ListNode[10];
for (int i = 0; i < nodes.length; i++) {
nodes[i] = new ListNode(i);
if (i > 0) {
nodes[i - 1].next = nodes[i];
}
}
if (pos >= 0 && pos < nodes.length) {
nodes[nodes.length - 1].next = nodes[pos];
}
// detect cycle
boolean result = hasCycle(nodes[0]);
textArea.setText(String.valueOf(result));
}
}
private boolean hasCycle(ListNode head) {
if (head == null || head.next == null) {
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while (slow != fast) {
if (fast == null || fast.next == null) {
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
private static class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
}
```
在这个例子中,我们使用了一个 `JFrame` 窗口来创建一个简单的界面,用户可以在界面中输入链表的头节点和尾节点位置,然后点击按钮进行判断。在 `actionPerformed` 方法中,我们首先获取用户输入的头节点和尾节点位置,然后根据这些信息创建一个链表。接下来,我们调用 `hasCycle` 方法来判断链表中是否存在环,并将结果显示在界面中。在 `hasCycle` 方法中,我们使用了快慢指针来判断链表中是否存在环,如果存在环,则返回 `true`,否则返回 `false`。
需要注意的是,这个例子中创建的链表是一个硬编码的链表,如果需要测试其他链表,需要修改代码。
阅读全文