剑指 Offer 06. 从尾到头打印链表
思路: 先遍历一遍列表,存放元素到数组里,再反转数组
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
ListNode *p=head;
vector<int> v;
while(p){
v.push_back(p->val);
p=p->next;
}
reverse(v.begin(),v.end());
return v;
}
};
class Solution {
public int[] reversePrint(ListNode head) {
ArrayList<Integer> list=new ArrayList<Integer>();
ListNode p=head;
while(p!=null){
list.add(p.val);
p=p.next;
}
Collections.reverse(list);
int[] arr=new int[list.size()];
int j=0;
for(Integer i:list) arr[j++]=i;
return arr;
}
}
剑指 Offer 24. 反转链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *q=0;
ListNode *p=head;
while (p) {
ListNode* nxt = p->next;
p->next = q;
q = p;
p = nxt;
}
return q;
}
};
class Solution {
public ListNode reverseList(ListNode head) {
ListNode p=head,q=null;
while(p!=null){
ListNode next=p.next;
p.next=q;
q=p;
p=next;
}
return q;
}
}
剑指 Offer 35. 复杂链表的复制
思路: 先遍历一遍链表,把所有的节点都拷贝一份,存在map里去,map的key是被拷贝的节点,map的value是拷贝后的复制后的节点
然后再遍历一遍链表,这时就可以通过map来找到值了
class Solution {
public:
unordered_map<Node *,Node *> mp;
Node* copyRandomList(Node* head) {
Node *p=head;
while(p){
mp[p]=new Node(p->val);
p=p->next;
}
Node h(-1);
p=head;
auto q=&h;
while(p){
q->next=mp[p];
q=q->next;
q->random=mp[p->random];
p=p->next;
}
return h.next;
}
};
class Solution {
HashMap<Node,Node> map=new HashMap<>();
public Node copyRandomList(Node head) {
Node p=head;
while(p!=null){
map.put(p,new Node(p.val));
p=p.next;
}
Node h=new Node(0);
Node q=h;
p=head;
while(p!=null){
q.next=map.get(p);
q=q.next;
q.random=map.get(p.random);
p=p.next;
}
return h.next;
}
}