24. 两两交换链表中的节点
19. 删除链表的倒数第N个节点
面试题 02.07. 链表相交
24 两两交换链表中的节点
一开始忘记了1和3之间还需要进行连接!
这样写会报错必须加上cur->next != nullptr; 这是假如是偶数的情况比如我现在是空链表,又或者是只有1->2->3->4,现在我的cur指向4了下一个就是nullptr了,cur->next->next,适用于奇数的情况比如1->2->3->4->5。
之前我想当然的认为cur->next->next = nullptr必然不会出现cur->next= nullptr的情况,因为当时我是固定了链表长度来进行的思考,倒推的,这是不对的!
19.删除链表的倒数第N个节点
这题用到了快慢指针的思想,真的好巧妙!
要想清楚到底删除的是哪一位,是slow,还是slow->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->next != nullptr){
fast = fast->next;
}
//fast = fast->next;
while(fast->next != nullptr){
slow = slow->next;
fast = fast->next;
}
ListNode *tmp = slow->next->next;
slow->next = tmp;
delete tmp;
return dummyHead->next;
}
这么写会报错
得改成这样
ListNode *tmp = slow->next;
slow->next = tmp->next;
delete tmp;
要删除哪个节点,就保存哪个节点哈!
面试题 02.07. 链表相交
给两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点,交点不是数值相等,而是指针相等!
这句话可以理解为,所谓链表相交,就是要让相交以后的链表完全一样,比如说链表相交后的长度,链表相交后所有节点的值也一样;
这个地方还有一个很巧妙的地方,就是相交的位置肯定后面的节点数量一样,所以两个curA和curB要先走到链表小的那个链表数目处。
在题目中已经给定了两个链表,我们只需求出其相交的位置,就是两个节点要相等,理解题目之后就好做了。