01_链表的翻转(C语言)

来源:互联网 发布:雪梨淘宝店名叫什么 编辑:程序博客网 时间:2024/06/11 04:24

本题讲的基于单链表的操作。

在操作链表的时候一定要记住:链表的删除和添加元素是非常灵活的。在适当的地方(1)断开指针连接,(2)拼接指针连接。

单链表的删除操作:

如图所示:假如一直节点5的地址为 p ,现在要删除结点7,则需要做如下步骤:

(1)由于在创建链表的时候,为每个节点都用 malloc 函数分配了内存,所以在是删除节点的时候需要释放内存。

  定义一个节点 q 用来保存即将删除的节点。  q = p->next ;

(2)将节点4 连接在 节点5 的后面,这样这样就自动的将节点7删掉了。

 p->next =  q->next ;

(3)释放节点7 的内存。 free(q); 


单链表的添加操作:

如图所示:假如要在节点5 和节点7 之间插入一个节点9,则需要如下步骤:

(1)定义一个节点并用 malloc 函数分配内存,用 q 表示。

(2)将节点7 连接在节点q 后面,即:q->next = p->next ;

(2)将节点q 连接在节点p 后面,即:p->next = q ;


题目:

输入一个链表,反转链表后,输出链表的所有元素。

struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};

代码分析:

思路:将每次要操作的节点作为新链表的头结点即:newList 

怎么实现呢?

       将新链表的 头结点newList  连接在要操作节点的后面: pHead->next = newList ; (也可以说是:将要操作的节点插入在新链表的头结点前面)

然后在更新 新链表的头节点位置。


ListNode* ReverseList(ListNode* pHead) 


        ListNode*  newList = 0 ;     //首先定义一个新链表的头结点


        while( pHead )

       {
            ListNode* temp = pHead->next ;  //暂时保留下一个节点
            
            pHead->next = newList ; 
            newList = pHead ;    //更新新链表的头结点
            pHead = temp ;
        }
        return newList ;
}


0 0
原创粉丝点击