6题目描述:
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
解析:
1.首先定义一个节点数量count为0,定义node节点指向头节点
2.while循环遍历链表,用count记录链表节点数量
3.定义nums数组,把node节点重新指向头节点
4.while循环遍历链表,把链表中的节点从后往前添加到数组中,最后返回nums数组即可
java:
public int[] reversePrint(ListNode head) {
int count = 0;
ListNode node = head;
while(node != null) {
node = node.next;
count++;
}
int[] nums = new int[count];
node = head;
while(node != null) {
count--;
nums[count] = node.val;
node = node.next;
}
return nums;
}
JavaScript:
var reversePrint = function(head) {
let count = 0;
let node = head;
while(node !== null) {
node = node.next;
count++;
}
const nums = [];
node = head;
while(node !== null) {
count--;
nums[count] = node.val;
node = node.next;
}
return nums;
};
35题目描述:
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
解析:
HashMap方法:
1.第一次遍历,存value
2.第二次遍历,处理徒弟的指向关系
3.最后返回徒弟链表的头节点
Java:
public Node copyRandomList(Node head) {
Node curr = head;
HashMap<Node, Node> map = new HashMap<>();
while(curr != null) {
map.put(curr, new Node(curr.val));
curr = curr.next;
}
curr = head;
while(curr != null) {
map.get(curr).next = map.get(curr.next);
map.get(curr).random = map.get(curr.random);
curr = curr.next;
}
return map.get(head);
}
JavaScript:
var copyRandomList = function(head) {
let curr = head;
let map = new Map();
while(curr !== null) {
map.set(curr, new Node(curr.val));
curr = curr.next;
}
curr = head;
while(curr !== null) {
map.get(curr).next = map.get(curr.next) === undefined ? null : map.get(curr.next);
map.get(curr).random = map.get(curr.random);
curr = curr.next;
}
return map.get(head);
};