在算法练习中遇到的链表问题
单链表
1.快慢指针找中点或者某一个位置
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode* slow = head, *fast = head, *prev = nullptr;
//快慢指针:使fast指针的前进速度为slow指针的前进速度的两倍,当fast指到链尾时,slow指针就指到链表中间结点
while (fast && fast->next ){//find mid node
slow = slow->next;
fast=fast->next->next;
}
2.链表翻转
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *p = head;//当前指针节点
ListNode *pre = NULL;//前指针节点
while (p!=NULL) { //循环都将当前节点指向它前面的节点,然后当前节点和前节点后移
ListNode* nxt = p->next;//临时节点,暂存当前节点的下一节点,用于后移
p->next = pre;//将当前节点指向它前面的节点
pre=p;//前指针后移
p=nxt; //当前指针后移
}
return pre;
}
};