iOS 字符串反转、单链表反转
字符串反转
做法就是,设立两个begin和end哨兵,然后将这两个哨兵对应的值进行交换,当 begin >=end 的时候,结束
void reverseStr(char *chr){
char *begin = chr;
char *end = chr + strlen(chr) - 1;
while (begin < end) {
char temp = *begin;
*(begin ++) = *end;
*(end --) = temp;
}
}
单链表反转
1->2->3->4->NULL 听过反转之后变成 4->3->2->1->NULL
头插法:
头插法需要我们定义一个新的头结点作为新的链表,然后利用头插法,将原来的链表的每一个节点取出来,然后去新的链表里面做头插法,这样就可以反转了,这里需要一个新的头结点,和遍历原来链表的一个P指针。
/// 构造一个链表
struct Node *constructList(void){
// 当前节点
struct Node *cur = NULL;
// 头结点
struct Node *head = NULL;
for (int i = 1 ; i < 5 ; i ++) {
struct Node *node = malloc(sizeof(struct Node));
node->data = i;
// 如果头结点为空
if (head == NULL) {
// 将当前节点赋值为头结点
head = node;
} else {
// 将当前节点的next指向这个新的节点,形成链表
cur->next = node;
}
// 将当前节点赋向后移动
cur = node;
}
cur->next = NULL;
return head;
}
上面的代码是构造一个链表,构造一个链表的思想就是,创建一个节点,然后如果当前有头结点,就将当前节点的next指向新创建的节点,然后将当前节点向后移动,如果当前没有头结点,就将头结点和当前节点都赋值为新创建的节点.
/// 链表的反转
/// @param head 头结点
struct Node * reverseList(struct Node *head){
// 新链表哨兵指针
struct Node *newHead = NULL;
// 旧链表哨兵指针
struct Node *p = head;
// 旧链表遍历完毕
while (p != NULL) {
// 下一个节点
struct Node *temp = p->next;
// 将这个节点头插到新的链表里面
p->next = newHead;
// 更改新链表的头位置
newHead = p;
// 旧链表的头向后移动
p = temp;
}
return newHead;
}
上面的代码是反转一个链表,反转链表的思想就是新建一个链表然后利用头插法,先从原来的链表里面按照顺序一个个取,取出来之后到新的链表里面进行头插,就形成了头插。
网友评论