[数据结构与算法-iOS 实现]字符串反转、单链表反转

2019-12-24  本文已影响0人  孙掌门

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;
}


上面的代码是反转一个链表,反转链表的思想就是新建一个链表然后利用头插法,先从原来的链表里面按照顺序一个个取,取出来之后到新的链表里面进行头插,就形成了头插。

上一篇下一篇

猜你喜欢

热点阅读