每次再遇到单链表的题时,别慌,先好好审题,抓住重点。这道题其实很简单,只要注意到题目的重点,首先是非头结点,然后是前差一个新节点,再就是要求不能遍历单链表。
我们可以先给单链表的一个非头结点后插一个新节点,这个很简单,很容易完成吧,但是好像和题目有点不一样,没关系,我们再把这个非头结点和新节点值给换一换,这样就符合题目要求了,是不是很机智呢!不过感觉文字描述的不太好,看得云里雾里的,接下来我们上一副示意图表示,示意图如下所示:
首先给单链表的一个非头结点后插一个新节点(图稍稍有点丑)
接下来就给pos节点和新节点换值域的值
代码如下所示:
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node * _pNext;
}*pNode;
//创建一个新节点
pNode BuyNode(DataType data)
{
pNode pNewNode = (pNode)malloc(sizeof(struct Node));
if(NULL == pNewNode)
{
assert(0);
return NULL;
}
pNewNode->_data = data;
pNewNode->_pNext = NULL;
return pNewNode;
}
// 非头结点前插入data
void InsertNotHead(pNode pos,DataType data)
{
pNode pNewNode;
pNode pCur;
if(NULL == pos)
return;
pNewNode = BuyNode(data);
if(NULL == pNewNode)
return;
pCur = pos;
pNewNode->_pNext = pCur->_pNext;
pCur->_pNext = pNewNode;
DataType temp = 0;
temp = pCur->_data;
pCur->_data = pNewNode->data;
pNewNode->_data = temp;
}
注意:编写代码时一定要对传入的参数进行检测,确保安全后方可使用。