一、剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
思路:对链表进行两次遍历,第一次遍历获得链表的长度size;第二次遍历将链表中的数据逆序放进固定size长度的数组中,时间和空间复杂度都是o(n)
代码实现
class Solution {
public int[] reversePrint(ListNode head) {
if(head==null){
return new int[0];
}
ListNode temp=head;
int size=0;
while(temp!=null){
temp=temp.next;
size++;
}
int[] res=new int[size];
size-=1;//数组最后一个元素的下标应该-1
while(head!=null){
res[size--]=head.val;
head=head.next;
}
return res;
}
}
二、剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
思路:使用头插法,将head中取到的节点在res中按照头插法插入,时间复杂度o(n)
代码实现
class Solution {
public ListNode reverseList(ListNode head) {
//当链表只有0个或一个节点时,直接返回head(注意条件的先后顺序)
if(head==null||head.next==null){
return head;
}
ListNode res=new ListNode();
ListNode temp;//临时节点
while(head!=null){
temp=res.next;//1.将res中的后续节点交给temp
res.next=head;//2.将res的下一个节点只想head
head=head.next;//3.head节点指向自己的下一个节点
res.next.next=temp;//4.将当前res和temp合并
//3和4的步骤不能反!
}
return res.next;
}
}
三、剑指 Offer 35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
思路:对head进行两次遍历,第一次将head中的节点以key值存放到map中,对应的value值为new出来的copy节点,第二次遍历将map中的节点根据key值进行连接。
class Solution {
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
Map<Node, Node> map = new HashMap<>();
Node cur = head;
while (cur != null) {
map.put(cur, new Node(cur.val));
cur = cur.next;
}
cur = head;
while (cur != null) {
map.get(cur).next = map.get(cur.next);
map.get(cur).random = map.get(cur.random);
cur = cur.next;
}
return map.get(head);
}
}