leecode 24反转链表
解题思路:用两个指针(迭代)
分别定义两个均指向空的指针 (pre/next);
next 用于记录当前节点的下一个节点(当前节点与当前节点的下一个节点之间连接断开前,先保存当前节点的下一个节点,防止断开后找不到当前节点的下一节点);
pre 用于在改变当前节点的指向之前,记录当前节点;
在头节点不为空的情况下,遍历链表(遍历过程中,改变 head/pre/next 节点的指向)。
以链表 1->2->3->NULL 为栗子,反转过程如下:
开始
next:调整头节点的下一节点之前,先记录其先前的下一节点(next = head->next),以防止链表断开后找不到其之前的下一节点
断开头节点与其下一节点的连接(head->next = pre),并反转(指向 NULL)
不断遍历,直到头节点指向链表的尾节点的下一节点(空节点)
pre = head
head 右移,head = next
next 指向当前head的下一节点
Definition for singly-linked list.
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* pre = NULL;
struct ListNode* next = NULL;
if(head == NULL||head->next == NULL)
{
return head;
}
while(head)
{
next = head->next;
head->next = pre;
pre = head;
head = next;
}
return pre;
}
剑指 Offer 24. 反转链表 - 反转链表 - 力扣(LeetCode)
leecode 10斐波那契数列
用动态规划,用三个变量记录f(k),f(k-1),f(k-2)的值,从0,1,2开始
int fib(int n){
int Mod = 1000000007;
if(n <2)
{
return n;
}
int i = 0,front = 0,mid = 0,rear = 1;
for(i = 2;i <= n;i++)
{
front = mid;
mid = rear;
rear = (front + mid)%Mod;
}
return rear;
}