天天看點

無頭單連結清單中删除非尾節點及插入節點(不能周遊連結清單)

首先給對外連結表節點的定義: 

#include <stdlib.h>
#include <assert.h>
#include <stdio.h>

typedef int DataType;

typedef struct SListNode
{
	DataType data;
	struct SListNode *pNext;
} SListNode;
           
  • 删除一個無頭單連結清單的非尾結點(不能周遊連結清單)

思路:本題要求不能周遊連結清單,那麼在知道所删節點資訊後,我們能夠知道的隻有該節點及該節點後面的節點資訊,是以我們隻能利用該節點後面的結點來達到删除該節點的目的。我們可以定義一個指針指向要删除節點的下一個節點,并将要删除結點的data和pNext都更新為下一個結點的data和pNext值,然後釋放所定義的指針。簡言之就是用所要删除節點的下一個結點來替換該節點,并删除該節點的下一個節點。

// 删除無頭連結清單的非尾結點(替換删除)
void RemoveNodeNotTail(SListNode *pos)
{
	SListNode *pCur = pos->pNext;
	pos->data = pCur->data;
	pos->pNext = pCur->pNext;
	free(pCur);
}
           
  • 插入一個節點到無頭單連結清單(不能周遊連結清單)

思路: 同樣,在隻知道要插入節點的位置及要插入的資料時,我們能利用地也隻有該節點後面的節點。首先也是将要插入節點位置的節點資訊複制一份,并儲存在一個新節點中,然後将要插入節點位置的節點資訊分别更新為data和前面所求的新節點。

//無頭連結清單前插入(替換插入) 
void InsertNoHead(SListNode *pos, int data)
{
	SListNode *pCur;
	pCur = (SListNode *)malloc(sizeof(SListNode));
	pCur->data = pos->data;
	pCur->pNext = pos->pNext;
	pos->data = data;
	pos->pNext = pCur;
}
           

繼續閱讀