1.单链表反转
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head){
ListNode* p = head->next;
ListNode* q = head;
while(p){
q->next = p->next;
p->next = head;
head = p;
p = q->next;
}
return head;
}
else
return {};
}
};
2.环形链表
bool hasCycle(ListNode *head) {
// if(head == nullptr) return false;
// ListNode* slow = head;
// ListNode* fast = head;
// while(slow != nullptr&&fast!=nullptr&&fast->next != nullptr){
// slow = slow->next;
// fast = fast->next->next;
// if(slow == fast) return true;
// }
// return false;
if (head) {
ListNode* slow = head;
ListNode* fast = head;
while (slow!=nullptr&&fast!=nullptr&&fast->next!=nullptr)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast) return true;
}
}
return false;
}
3.合并两个有序链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode dummyHead(0);
auto p = &dummyHead;
while(l1& &l2){
if(l1->val<l2->val){
p ->next = l1;
p = l1;
l1 = l1->next;
}else{
p->next = l2;
p = l2;
l2 = l2->next;
}
}
p->next = l1 ? l1:l2;
return dummyHead.next;
}
4.链表中倒数第n个节点
ListNode* removeNthFromEnd(ListNode* head, int n) {
if (head == nullptr || n < 1) return {};
ListNode* l1 = head;
ListNode* l2 = head;
while (n&&l1) { n--; l1 = l1->next; }
if (n > 0) return {};
if(l1 == nullptr) return head->next;
while (l1->next) { l1 = l1->next; l2 = l2->next; }
ListNode* tmp = l2->next;
l2->next = tmp->next;
delete tmp;
return head;
}
5.链表中间节点
class Solution {
public:
ListNode* middleNode(ListNode* head) {
if(head == nullptr) return {};
int len = 1;
ListNode* p = head;
while(p->next){len++;p = p->next;}
len = len/2+1;
p = head;
while(--len){
p = p->next;
}
return p;
}
};