本题讲的基于单链表的操作。
在操作链表的时候一定要记住:链表的删除和添加元素是非常灵活的。在适当的地方(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 ;
}