You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用.dot语言绘制双向循环链表,如何将一条循环边移至节点上方?

双向循环链表Dot绘图问题

尝试用Dot语言绘制双向循环链表,生成的图不符合预期:两条循环边均位于节点下方,希望其中一条显示在节点上方。

期望效果

expected result

实际效果

given result

原Dot代码

digraph {
    node[shape=record];
    graph[pencolor=transparent];
    rankdir=LR;
    p1[label="{<prev>|<data> 12|<next>}"];
    p2[label="{<prev>|<data> 12|<next>}"];
    p3[label="{<prev>|<data> 12|<next>}"];


        p1:next -> p2:prev;
    p2:next -> p3:prev;
    p2:prev -> p1:next;
    p3:prev -> p2:next;
        edge[tailclip=false,dir="forward" splines="compound" constraint= "false"];


p3:next -> p1:prev;

p1:prev -> p3:data;


}

解决方案

要让其中一条循环边绕到节点上方,可通过指定边的端口属性、调整布局约束来实现,修改后的代码如下:

digraph {
    node[shape=record];
    graph[pencolor=transparent];
    rankdir=LR;
    p1[label="{<prev>|<data> 12|<next>}"];
    p2[label="{<prev>|<data> 12|<next>}"];
    p3[label="{<prev>|<data> 12|<next>}"];

    // 正向链表边
    p1:next -> p2:prev;
    p2:next -> p3:prev;
    // 反向链表边(下方)
    p2:prev -> p1:next [dir=back];
    p3:prev -> p2:next [dir=back];
    
    // 首尾循环边:从节点顶部走
    p3:next -> p1:prev [tailport=n, headport=n, splines=polyline, constraint=false];
    // 首尾反向循环边:从节点底部走
    p1:prev -> p3:next [dir=back, tailport=s, headport=s, splines=polyline, constraint=false];
}

修改说明

  • 端口强制指定:用tailport=n/headport=n(n代表顶部)让一条循环边从节点顶部穿过,tailport=s/headport=s(s代表底部)让另一条从底部走,直接控制边的走向。
  • 箭头方向简化:用dir=back设置反向边的箭头,替代重复绘制正向边的冗余写法。
  • 布局约束调整:constraint=false避免边干扰节点的横向排列,splines=polyline让边的折线更规整,贴合双向链表的常规视觉呈现。

内容的提问来源于stack exchange,提问作者Diego Huite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:27:13