本节小编将分享链表的部分练习题,友友们可以自己去练练,更好的理解链表!
1.找倒数节点
采用快慢指针的方法,先让快指针走k步,然后两个指针同时运动,当快指针指向空时,慢指针刚好指向满足的倒数节点。
struct ListNode { int val; struct ListNode *next; }; typedef struct ListNode LN; int kthToLast(struct ListNode* head, int k){ LN*fast,*slow; fast=slow=head; //快指针先走k步 while(k--){ fast=fast->next; } while(fast){ slow=slow->next; fast=fast->next; } return slow->val; }
2.链表的中间节点
给单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
本题同样可以采取快慢指针的方法,快指针和慢指针同时从头节点出发,快指针走两步,慢指针走一步,当快指针为空或者快指针的下一节点为空时,慢指针刚好指向满足条件的中间节点。(节点为偶数,奇数时)
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ typedef struct ListNode LN; struct ListNode* middleNode(struct ListNode* head) { LN *slow,*fast; slow=fast=head; while(fast && fast->next){ slow=slow->next; fast=fast->next->next; } //此时slow指向的是中间节点 return slow; }
3.反转链表
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
思路1:创建一个新链表,遍历原链表,将原链表节点头插到新链表中。
思路2:创建三个指针n1,n2,n3,完成翻转。
让n2->next=n1;n1=n2;n2=n3;n3=n3->next,到n3指向空。
循环操作...循环操作...循环操作
struct ListNode { int val; struct ListNode *next; }; typedef struct ListNode LN; struct ListNode* reverseList(struct ListNode* head) { if (head==NULL) return head; LN *n1,*n2,*n3; n1=NULL; n2=head; n3=head->next; while(n2){ n2->next=n1; n1=n2; n2=n3; if(n3) n3=n3->next; } return n1; }
链表题目练习及讲解(下):https://developer.aliyun.com/article/1624371