一、 剑指offer 06. 从尾到头打印链表
要求:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
注意这里的头结点head是包含值val的。
解法1:使用栈进行反序输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
class Solution { public int[] reversePrint(ListNode head) { Stack<ListNode> stack = new Stack<>(); while(head!=null){ stack.push(head); head = head.next; } int[] arr = new int[stack.size()]; for(int i = 0; i < arr.length;i++){ arr[i] = stack.pop().val; } return arr; } }
|
二、 剑指 Offer 24. 反转链表
要求:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
解法1:使用栈+辅助头结点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
class Solution { public ListNode reverseList(ListNode head) { Stack<ListNode> stack = new Stack<>(); while(head!=null){ stack.push(head); head = head.next; } ListNode newHead = null; ListNode headInfo = null; while(stack.size()!=0){ if(newHead == null){ newHead = stack.pop(); headInfo = newHead; continue; } ListNode temp = stack.pop(); temp.next = newHead.next; newHead.next = temp; newHead = newHead.next; } return headInfo;
} }
|
解法二:直接使用头插法
具体思路:腾讯面试题-单链表的头插法
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
class Solution { public ListNode reverseList(ListNode head) { ListNode newHead = new ListNode(-1); while(head!=null){ ListNode temp = head; head = head.next; temp.next = newHead.next; newHead.next = temp; } return newHead.next;
} }
|
使用头插法简洁,时间复杂度也小。注意要先移动head指针,保存该结点下一个结点的地址,再使用temp指针插入辅助的链表。
三、 剑指 Offer 35. 复杂链表的复制
要求:请实现 copyRandomList
函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next
指针指向下一个节点,还有一个 random
指针指向链表中的任意节点或者 null
。
思路:通过Hashmap来实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
class Solution { HashMap<Node,Node> NodeList = new HashMap<>(); public Node copyRandomList(Node head) { if(head == null){ return null; } if(!NodeList.containsKey(head)){ Node newHead = new Node(head.val); NodeList.put(head,newHead); newHead.next = copyRandomList(head.next); newHead.random = copyRandomList(head.random); } return NodeList.get(head); } }
|