四向链表(朗致面试经验)如有侵权联系删除
一.输入一个正整数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("");
}
版权说明
本人经历面试后写的程序。后面花费了点儿时间。原创。不求赏金。但求点赞。谢谢