19. 删除链表的倒数第 N 个结点
-
给你一个链表,删除链表的倒数第
n个结点,并且返回链表的头结点。 -
示例 1:

-
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode*vhead = new ListNode(-1,head); ListNode* pre = vhead; ListNode* cur = vhead; while(n--) //&& cur->next != nullptr 这里的n一定要小于 size { cur = cur->next; } //cur = cur->next; while(cur->next != nullptr) //cur 最后指向是最后一个节点 { cur = cur->next; pre = pre->next; } ListNode * temp = pre->next; pre->next= pre->next->next; delete temp; return vhead->next; // 有可能把原来的head删了所以要返回vhead->next; }
160. 相交链表
-
给你两个单链表的头节点
headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点
c1开始相交:
-
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if(headA == nullptr || headB == nullptr) return nullptr; ListNode *PA = headA,*PB = headB; while(PA != PB) { if(PA == nullptr) { PA = headB; }else{ PA = PA->next; } if(PB == nullptr) { PB = headA; }else{ PB = PB->next; } } return PA; } -
pA走过的路径为A链+B链
pB走过的路径为B链+A链
pA和pB走过的长度都相同,都是A链和B链的长度之和,相当于将两条链从尾端对齐,如果相交,则会提前在相交点相遇,如果没有相交点,则会在最后相遇。
-
pA:1->2->3->4->5->6->null->9->5->6->null pB:9->5->6->null->1->2->3->4->5->6->null
142. 环形链表 II
-
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
-
ListNode *detectCycle(ListNode *head) { if(head == nullptr) return nullptr; ListNode* vhead = new ListNode(-1,head); ListNode * pre = vhead; //保证出发点一致即可 //这里和16行都换成head 也可 ListNode * cur = vhead; while( cur->next != nullptr&& cur->next->next != nullptr ) { cur = cur->next->next; pre = pre->next; if(cur == pre ) { ListNode*index1 = cur ; ListNode*index2 = vhead; while(index1 != index2) { index1 = index1 -> next; index2 = index2 -> next; } return index2 ; } } return nullptr; } -
一定保证出发点是一致的

链表操作:删除倒数节点、相交与环检测
文章介绍了如何在链表中删除倒数第n个节点,以及寻找两个链表的相交节点和检测环形链表的方法。通过示例展示了ListNode类的使用和逻辑实现。
239

被折叠的 条评论
为什么被折叠?



