单链表反置
void sor(Node **head)
{
if (!head) return ; // 参数无效
Node * cur = *head;
if (!cur || !cur->next) return ; // 列表为空,或者只有一个节点
// cur
// |
// V
// node1 -> node2 -> node3 -> ... node5
Node * prev = NULL;
while(cur && cur->next)
{
// 暂存一下cur
Node * temp = cur;
// cur,temp
// |
// V
// node1 -> node2 -> node3 -> ... node5
// 移动一个
cur = cur->next;
// temp cur
// | |
// V V
// node1 -> node2 -> node3 -> ... node5
// 暂存节点的next指针指向上一个prev
temp->next = prev;
// temp cur
// | |
// V V
// node1 node2 -> node3 -> ... node5
// |
// V
// prev(NULL)
// 把暂存节点的指针值给prev
prev = temp;
// temp,prev cur
// | |
// V V
// node1 node2 -> node3 -> ... node5
// |
// V
// (NULL)
}
cur->next = prev;
*head = cur;
}
整数到字符串转换
void change(int number, char s[])
{
bool is_minus = (number < 0);
number = is_minus ? number * -1 : number;
char * x = s;
do{
*x++ = number%10 + '0';
number /= 10;
}while(number);
if (is_minus)*x++ = '-';
// 终结符
*x = '\0';
// 倒置一下
int len = strlen(s);
for (int i = 0; i < (len-1)/2; i ++)
{
char c = s[i];
s [i] = s[len-i-1];
s [len-i-1] = c;
}
return ;
}
最大回文
void huiwen(char input[], int len, char output[])
{
for (int i = len; i >= 1; i --)
{
for (int j = 0; j <= len-i; j ++)
{
// 判断input[j...(len-i-1-j)]这一段是否是回文
// 使用经典的回文判断算法
int head = j;
int tail = j+i-1;
while (head < tail && input[head++] == input[tail--]);
// 下标交错了
// 回文
if (head >= tail)
{
// 从j开始复制i个长度返回
memcpy(output, input + j, i);
return ;
}
}
}
}