四向链表的创建、打印预览,遍历。任意节点出发遍历整个链表(不重复)

1 篇文章 0 订阅
1 篇文章 0 订阅

四向链表(朗致面试经验)如有侵权联系删除

一.输入一个正整数n生成n x n 的举证。每个节点有up,down,right,left,和val

你好!

首先创建链表,包含生成四向链表的方法

/***
 * @Author liujixiang 
 * @Date 2023-11-07
 * 四向链表 上下左右都有,
 * 1.4个顶点
 */
public class Node4<T> {

  T val;
  Node4<T> left;
  Node4<T> right;
  Node4<T> up;
  Node4<T> down;

  Node4(T val) {
    this.val = val;
    left = null;
    right = null;
    up = null;
    down = null;
  }

  public static Node4<Integer> create4DirectLink(int n) {
    if (n <= 0) {
      return null;
    }

    // 创建第一个节点
    Node4<Integer> head = new Node4<>(1);
    // 创建第一维链表
    Node4<Integer> current = head;
    for (int i = 2; i <= n; i++) {
      Node4<Integer> newNode = new Node4<>(i);
      current.right = newNode;
      newNode.left = current;
      current = newNode;
    }
    // 创建剩余维度的链表
    Node4<Integer> prevRowHead = head;
    Node4<Integer> prevRowCurrent = prevRowHead;
    for (int row = 2; row <= n; row++) {
      // 按行创建
      Node4<Integer> newRowHead = new Node4<>(row * n + 1);
      prevRowCurrent.down = newRowHead;
      newRowHead.up = prevRowCurrent;
      current = newRowHead;
      for (int col = 2; col <= n; col++) {
        //  按列创建,因为本列第一个已经创建过了,所以从第2个开始
        Node4<Integer> newNode = new Node4<>((row - 1) * n + col);
        current.right = (newNode);
        newNode.left = current;
        // 每创建一个,都要找他的帽子。帽子计算完了要往后移,以迎接下个col
        prevRowCurrent = prevRowCurrent.right;
        prevRowCurrent.down = newNode;
        newNode.up = prevRowCurrent;
        current = newNode;
      }
      // 本次新生成的行首,将作为下一次循环的帽子 排头兵
      prevRowHead = newRowHead;
      // 帽子游标沿着帽子排头兵 往后挨个给 col扣帽子
      prevRowCurrent = prevRowHead;
    }
    return head;
  }
}

二、图形化打印出来看效果 (图形化打印,四向链表)

 /***
   * 图形化打印 四向链表
   * @param node 链表头结点
   */
  private static void printListNode(Node4 node) {
    Node4 row = node;
    while (row != null) {
      Node4 cur = row;
      while (cur != null) {
//        System.out.print(cur.val + " " + "up node:" + (cur.up == null ? null : cur.up.val) + "   ");
        System.out.print(String.format("%3d  ",cur.val));
        cur = cur.right;
      }
      System.out.println();
      row = row.down;
    }
  }

三、编写一个测试方法

/**
   * 1. 手写一个四向链表结构带泛型
   * 2. 然后写一个函数实现以下功能:
   * 2.1 输入参数int n,生成一个多维四向链表
   * 2.2 每个节点都有四个方向,如果有值就指向他,如果没有,就指向null
   * 2.3 任意节点出发,遍历整个链表
   * */
  @Test
  public void testNode4(){
//    int n = new Random().nextInt(1) + 10;
    int n =4;
    System.err.println(n + "维");
    Node4 head = Node4.create4DirectLink(n);
    // 打印看看效果 (图形化看着舒服)
    printListNode(head);
    // 任意节点触发,遍历整个数组(不可重复)。禁止条件:禁止初始时回到原位,因为意味着会出现1个节点遍历2次的情况
    Node4 start = head.right.right.down.down;
    log.info("右节点 {} 开始遍历",start.val);
    printAll(start);
  }

四、从任意节点出发,遍历所有节点,不可重复,不可开始时移到初始位置。只能从start出发。

/***
   * 由某个节点出发,挨个遍历 (每个节点不可重复)
   * @param start
   */
  public void printAll(Node4 start){
    if(start == null){
      return;
    }
    Node4 curr=start;
    printLevel(curr);
    // 先打印上,再打印下
    Node4 up = curr.up;
    while (up!=null){
      this.printLevel(up);
      up = up.up;
    }
    Node4 down = curr.down;
    while (down!=null){
      this.printLevel(down);
      down = down.down;
    }

  }
  
  /** 只打印本层的数据, */
  private void printLevel(Node4 start){
    if(start == null){
      return;
    }
    // 打印 起始节点
    System.out.print(String.format("%2d ", start.val));
    // 打印左右
    Node4 left = start.left, right = start.right;
    while (left != null) {
      System.out.print(String.format("%2d ", left.val));
      left = left.left;
    }
    while (right != null) {
      System.out.print(String.format("%2d ", right.val));
      right = right.right;
    }
    System.out.println("");
  }

版权说明

本人经历面试后写的程序。后面花费了点儿时间。原创。不求赏金。但求点赞。谢谢

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值