剑指 Offer 06. 从尾到头打印链表
https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/
- 链表中的元素通过指针相连,从头结点顺序遍历链表元素,依次插入栈中,栈是先入后出的,反过来遍历栈就相当于,链表的倒序。
- 代码如下:
class Solution {
public int[] reversePrint(ListNode head) {
Stack<Integer> stack = new Stack<>();
ListNode temp = head;
while(temp!=null){
stack.push(temp.val);
temp = temp.next;
}
int size = stack.size();
int[] res = new int[size];
int i=0;
while(!stack.empty()){
res[i] = stack.pop();
i=i+1;
}
return res;
}
}
剑指 Offer 24. 反转链表
https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/
- 调转指针,将当前节点的next指向前一个节点,为了不断链,在遍历时记录当前节点的下一个节点
- 头节点的前一个节点为null,初始化前驱节点为null
- 当前节点在指向前一个节点之后,前驱节点指针后移,当前指针指向已经被记录的Next节点
- 代码如下:
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode cur = head;
while(cur!=null){
ListNode next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}
}
剑指 Offer 35. 复杂链表的复制 中等
https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/
思路如下:
- 原地复制,原链表的每一个节点的next都是复制节点,复制节点的下一个是原链表节点的下一个节点
copy.next=node.next;node.next = copy。copy节点的next先指向node节点的下一个,然后node节点再指向copy节点,以免断链。 - 拷贝random节点,下一个复制节点的random就等于当前原链表节点的random节点的下一个节点
node.next.random = node.random.next; - 每次遍历都指向next.next,即原链表的节点上
- 最后拆分重复的链表,新链表头节点指向原链表头节点的下一个节点
- 每次都指向当前节点的next的next,避免断链,先记录当前节点的下一个节点的地址
temp = node.next;node.next = temp.next;node = temp
- 代码如下:(复制的别人的)
class Solution {
public Node copyRandomList(Node head) {
if (head == null) {
return head;
}
//将拷贝节点放到原节点后面,例如1->2->3这样的链表就变成了这样1->1'->2->2'->3->3'
for (Node node = head, copy = null; node != null; node = node.next.next) {
copy = new Node(node.val);
copy.next = node.next;
node.next = copy;
}
//把拷贝节点的random指针安排上
for (Node node = head; node != null; node = node.next.next) {
if (node.random != null) {
node.next.random = node.random.next;
}
}
//分离拷贝节点和原节点,变成1->2->3和1'->2'->3'两个链表,后者就是答案
Node newHead = head.next;
for (Node node = head, temp = null; node != null && node.next != null;) {
temp = node.next;
node.next = temp.next;
node = temp;
}
return newHead;
}
}
浙公网安备 33010602011771号