一直以来对算法有一种恐惧感,在没有刷题的情况下就匆忙开始秋招笔试。然后结果可想而知,除了一些原题以及一些非常常见的题目可以动手(然而自己编写却出现很多问题),对于大部分的需要稍微思考的算法题,通常是丈二的和尚摸不着头脑。秋招之后,觉得算法的基础过于薄弱,于是开始陆陆续续刷算法题,现终于差不多刷完《剑指offer》以及相关题目。于是准备对常见的算法题进行一个总结,结合良好思路和自己的理解记录在博客上。以此来勉励自己,如有错误或者不合理的地方,也希望得到读者的反馈和纠正以便共同进步!
单链表的翻转
对于顺序结构中数组的翻转,将从前往后遍历改为从后往前遍历。而为了正确翻转一个链表,必须调整链表中指针的方向,因为链表并不是连续存储的,而是通过一条条“链条”连接起来的。
分别确定是三个节点,prev,pcur,pnext,为了使原链表翻转,必须修改指针的指向,首先我们让pur指向prev,这个时候为了防止pnext断链,所以我们必须还要保存pnext。然后依次向后遍历,让prev指向pcur,并且pcur指向pnext,直到pcur为空。最后,保存原链表的尾节点即为翻转后的单链表的首节点。
ListNode *reverse(ListNode *head)
{
//首先判断头结点是否为空或者头结点的下一个节点是否为空
if (head == nullptr || head->next == nullptr) return head;
ListNode *prev = head; //前节点
ListNode *pcur = head->next;// 当前节点
ListNode *pnext = nullptr; //后节点
while (pcur != nullptr)
{
pnext = pcur->next; //保存下一个节点
pcur->next = prev; //改变指针指向
//依次向后遍历
prev = pcur;
pcur = pnext;
}
//确定新链表的头结点,就是原链表的尾节点
head->next = nullptr;
head = prev;
return head;
}