快慢指针
1.快慢指针的概念:
快慢指针就是存在两个指针,一个快指针,一个慢指针,两个指针每次移动的速度不一样,快的移动的快,慢的移动的慢。快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。
2.快慢指针的应用:
1. 判断单链表是否为循环链表
如果链表是单纯的环形链表我们的代码可以是这样的: javascript bool isCLinkList(List *Head) { List *p = Head; while(p) { p = p->next; if(p == Head) { return true; } } return false; }
但是仔细一想这种办法只能判断链表为圆形的那种环形链表,就是头尾相连的那一种。
bool hasCycle(struct ListNode *head) {
struct ListNode * slow = head; struct ListNode * fast = head; while (fast && fast -> next) {
slow = slow -> next; fast = fast -> next -> next; if (fast == slow) {
return true; } } return false; }
定义两个指针,一个快指针,一个慢指针,快指针每次前进两步,慢指针每次前进一步,如果快指针追上了慢指针则说明这个链表是环形链表,如果没追上,则证明这个链表就是单链表。
快慢指针就好像两个人在赛跑,如果是在一个环形的跑道中,那么他们一直跑下去的话,快的就肯定能追上慢的,而且最少比慢的多跑了一圈。快慢指针判断环形链表就是这样的情况。
2. 在有序链表中寻找中位数
int GetMedian(List *head) {
List *fast = *slow = head; while(fast && slow){
if(fast == NULL){
return slow -> data; }else if(fast -> next == NULL){
return (double)(slow -> data + slow -> next -> data) / 2; }else{
fast = fast -> next -> next; slow = slow -> next; } } }
3.链表中倒数第k个节点
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
if (k == 0 || head == NULL) {
return NULL; } struct ListNode *p = head; struct ListNode *q = head; int i; for (i = 0; i < k - 1; i++) {
p = p -> next; if (p == NULL) {
return NULL; } } while (p -> next != NULL) {
q = q -> next; p = p -> next; } return q; }
这就是我本周分享关于快慢指针的内容,快慢指针在平时的应用最多的就是这三种题型,但是还有很多也可以应用快慢指针的思想,希望对大家有帮助。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208579.html原文链接:https://javaforall.net
