注意:
1.一定要采用虚拟头结点的方式
2.循环的条件是while(cur -> next !=NULL && cur ->next ->next != NULL) ,其中cur -> next !=NULL必须在cur -> next -> next!=NULL的前面
3.cur最终指向的是cur->next ->next也就是说指在3的前面
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode *dummyHead = new ListNode(0);
dummyHead ->next = head;
ListNode *cur = dummyHead;
while(cur -> next !=NULL && cur ->next ->next != NULL) {
ListNode *tmp1 = cur->next;
ListNode *tmp2 = cur ->next->next->next;
cur ->next = cur->next->next;
cur ->next ->next = tmp1;
cur ->next ->next ->next = tmp2;
cur = cur ->next ->next ;//cur只用移两位就行是两个next
}
return dummyHead->next;
}
};
注意点:
1.利用虚拟头节点+双节点的方式,取最后N位节点,就让一个fast节点提前走N步,然后fast和slow一起走,当fast走到最后一个节点的时候,slow刚好走到最后N位节点的前一位(因为他们是从虚拟头节点出发的),之后令slow->next = slow->next->next就将需要删除的节点给删除了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummyHead = new ListNode(0);
dummyHead ->next = head;
ListNode *fast = dummyHead;
ListNode *slow = dummyHead;
while(n--) {
fast = fast ->next;
}
while(fast->next != NULL) {
fast = fast->next;
slow = slow ->next;
}
ListNode *tmp = slow ->next;
slow -> next = slow->next ->next;
delete tmp;
return dummyHead->next;
}
};
注意点:
1.交点不是数值相等,而是指针相等
2.首先应比较两个链表的长度
3.确定两者中较长的那个链表--确定之前让指针回到头结点
4.一个一个循环,最终确定链表位置相同的节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *curA = headA;
ListNode *curB = headB;
int lenA = 0;
int lenB = 0;
// 求curA和curB的长度
while(curA != NULL) {
lenA++;
curA = curA->next;
}
while(curB != NULL) {
lenB++;
curB = curB->next;
}
// 回到头结点的位置,方便下一步的交换swap
curA = headA;
curB = headB;
if(lenB > lenA) {
swap(lenA,lenB);
swap(curA,curB);
}
int gap = lenA-lenB;
// 使curA和curB在同一位置
while(gap--)
curA = curA ->next;
while(curA != NULL) {
if(curA == curB)
return curA;
curA = curA ->next;
curB = curB ->next;
}
return NULL;
}
};
注意点:
1. while(fast != NULL && fast->next != NULL)循环fast是两步骤两步往前跳的,得判定上一个是否是空
2.主要解题思路就是
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *fast = head;
ListNode *slow = head;
while(fast != NULL && fast->next != NULL) {
fast = fast ->next ->next;
slow = slow ->next;
if(fast == slow) {
ListNode *index1 = fast;
ListNode *index2 = head;
while(index1 != index2 ) {
index1 = index1 ->next;
index2 = index2 ->next;
}
return index2;
}
}
return NULL;
}
};