反转链表
public:
ListNode* reverseList(ListNode* head) {
// 1. 递归终止条件
if (head == nullptr || head->next == nullptr) return head;//最后一个是p
//注意上面的顺序不能调换!否则报错引用了空指针(head->)当head本身就是空的时候!!
ListNode* p = reverseList(head->next);
head->next->next = head;
//head.next.next本来是指向null,,等于的head就是让他在指到反转指回去
head->next = nullptr;
//再让head下一个变成null指回去null
return p;//由于这个导致返回的每次返回的是同一个p
//注意这个不是head,如果是head就乱了
}
删除链表重复的元素
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head;
}
head.next = deleteDuplicates(head.next);
if(head.val == head.next.val) head = head.next;//直接将head变成head->next等效删除
return head;
}
}
合并两个升序链表 双90
if(!list1) return list2;
else if(!list2) return list1;
else if(list1->val<list2->val)
{
list1->next=mergeTwoLists(list1->next ,list2);
return list1;
}
else{list2->next=mergeTwoLists(list1 ,list2->next);
return list2;
}
返回链表倒数第k个结点的值
//全局变量,记录递归往回走的时候访问的结点数量
int size;
public int kthToLast(ListNode head, int k) {
//边界条件判断
if (head == null)
return 0;
int val = kthToLast(head.next, k);
++size;
//从后面数结点数小于k,返回空
if (size < k) {
return 0;
} else if (size == k) {
//从后面数访问结点等于k,直接返回传递的结点k即可
return head.val;
} else {
//从后面数访问的结点大于k,说明我们已经找到了,
//直接返回node即可
return val;
}
}