24.两两交换链表中的节点
我的代码:
ListNode* swapPairs(ListNode* head) {
if(head == nullptr) return head;
ListNode* DummyNode = new ListNode();
DummyNode->next = head;
ListNode* cur = DummyNode;
while(cur->next != nullptr && cur->next->next != nullptr){
ListNode* tmp1 = cur->next;
ListNode* tmp3 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = tmp1;
cur->next->next->next = tmp3;
cur = cur->next->next;
}
return DummyNode->next;
}
做题心得和注意事项:
? ? ? ? 首先要搞清楚要变换哪几个节点,以例子的 1234为例,设立个虚拟头结点为了不用对头结点单独处理。
????????之后就是对12进行变换,对12转换成21,我们得保留在转换中会丢失的节点信息,一个就是 1,一个就是3,因为按照顺序,我们会将 虚拟头结点指向2,则原本指向1的地址就没了,1就丢失了,那么我们就需要保存1的链表信息,代码中我定义为 tmp1,此外当我们完成了 虚拟头结点->2->1,之后 3本来是接在 2后面,但是 2后面按照顺序指向了1,所以 3的地址也就丢失了,那么我们就得额外给 3节点一个指针进行保存,代码中我定义为 tm3,当这些元素都保存好后,就可以按照正常的转换一步一步赋值进行下去了。
????????此外还需要注意, cur 指针的移动是移动 2格,因为是 2个2个转换,模拟一下即可明白。
19.删除链表的倒数第N个节点?
我的代码:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* cur = head;
ListNode* DummyNode = new ListNode();
ListNode* cur_while = DummyNode;
DummyNode->next = head;
int size = 0;
while(cur != nullptr){
size++;
cur = cur->next;
}
int nums = size - n;
while(nums--){
cur_while = cur_while->next;
}
ListNode* tmp = cur_while->next;
cur_while->next = cur_while->next->next;
delete tmp;
return DummyNode->next;
}
做题心得和注意事项:
? ? ? ? 想法思路很朴素,先记录建表的长度,再根据倒数第几个需要删除的,计算出正向遍历的次数 nums,之后就是简单的删除操作,没有其他需要注意的东西了。
我的代码:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int A_len = 0, B_len = 0, minus;
ListNode* LenA = headA;
ListNode* LenB = headB;
while(LenA != nullptr){
A_len++;
LenA = LenA->next;
}
while(LenB != nullptr){
B_len++;
LenB = LenB->next;
}
LenA = headA;
LenB = headB;
if(A_len > B_len){
minus = A_len - B_len;
while(minus--){
LenA = LenA->next;
}
while(LenA != nullptr){
if(LenA == LenB) return LenA;
LenA = LenA->next;
LenB = LenB->next;
}
}else{
minus = B_len - A_len;
while(minus--){
LenB = LenB->next;
}
while(LenB != nullptr){
if(LenA == LenB) return LenB;
LenB = LenB->next;
LenA = LenA->next;
}
}
return NULL;
}
心得:
? ? ? ? ?下面写 if 的地方还是可以优化, 可以swap()直接选择 A或者B 为最大的那个,直接进行操作。
在写 142 之前可以先写 141.环形链表 | ,有个关联关系
141.环形链表 |
后面补上
142.环形链表||
心得: