24. 两两交换链表中的节点
用虚拟头结点,这样会方便很多。
本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。
题目链接/文章讲解/视频讲解: https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html
代码如下
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head){
struct ListNode* phead = (struct ListNode*)malloc(sizeof(struct ListNode));
phead->next = head ; //创建虚拟头节点
struct ListNode* cur = phead ;
while(cur->next !=NULL && cur->next->next != NULL){
struct ListNode* tmp = cur->next ;
struct ListNode* tmp1 = cur->next->next->next ;
cur->next = cur->next->next ;
cur->next->next = tmp ;
tmp->next = tmp1 ;
cur = cur->next->next ;
}
head = phead->next ;
struct ListNode* t = phead ;
free(t) ;
return head ;
}
感想:链表的题目先要把思路理清楚,然后画图,还有就是一些关键的节点要进行提前保存。卡哥视频讲解很清楚。
19.删除链表的倒数第N个节点
双指针的操作,要注意,删除第N个节点,那么我们当前遍历的指针一定要指向 第N个节点的前一个节点,建议先看视频。
代码如下
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode* phead = (struct ListNode*)malloc(sizeof(struct ListNode));
phead->next = head ;
struct ListNode* fast = phead ;
struct ListNode* slow = phead ;
n++;
while(n && fast!=NULL ){
fast = fast->next ;
n-- ;
}
while(fast!=NULL){
fast = fast = fast->next ;
slow = slow->next ;
}
struct ListNode* tmp = slow->next ;
slow->next = slow->next->next ;
free(tmp);
head = phead->next;
struct ListNode* tmp1 = phead ;
free(tmp1) ;
return head ;
}
面试题 02.07. 链表相交
本题没有视频讲解,大家注意 数值相同,不代表指针相同。
代码如下
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode * pheada = ( struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode * pheadb = ( struct ListNode *)malloc(sizeof(struct ListNode));
pheada->next = headA ;
pheadb->next = headB ;
int lena = 0 ;
int lenb = 0 ;
struct ListNode * cura = pheada ;
struct ListNode * curb = pheadb ;
while(cura != NULL ){
cura = cura->next ;
lena++ ;
}
while(curb != NULL ){
curb = curb->next ;
lenb++ ;
}
cura = pheada ;
curb = pheadb ;
int gap;
if(lenb > lena){
gap = lenb - lena ;
while(gap){
curb = curb->next ;
gap-- ;
}
}else{
gap = lena - lenb ;
while(gap){
cura = cura->next ;
gap-- ;
}
}
while(cura != NULL){
if(cura == curb){
return cura ;
}else{
cura = cura->next ;
curb = curb->next ;
}
}
return NULL ;
}
感想:这道题难点在于理解题目,要理解找的是指针。
142.环形链表II
算是链表比较有难度的题目,需要多花点时间理解 确定环和找环入口,建议先看视频。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html
代码如下
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode * fast = head ;
struct ListNode * slow = head ;
while(fast != NULL && fast->next != NULL){
fast = fast->next->next ;
slow = slow->next ;
if(fast == slow){
struct ListNode * index1 = fast ;
struct ListNode * index2 = head ;
while(index1 != index2){
index1 = index1->next ;
index2 = index2->next ;
}
return index1 ;
}
}
return NULL ;
}
感想: 今天整体感觉没有昨天那么