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; }
-
一定保证出发点是一致的