使用虚拟节点法进行链表的设计
1.在操作过程中一定要注意边界条件,否则代码通过不了,比如对链表尾部进行操作的时候
2.注意在内存的申请
编程实现
C++:
class MyLinkedList {
public:
//定义链表结构体
struct LinkNode
{
int val;
LinkNode* next;
LinkNode(int val):val(val), next(nullptr){}
};
//构造函数
MyLinkedList()
{
size = 0;
dummyHead = new LinkNode(0);
}
//获取链表中下标为index的节点的值
int get(int index)
{
if(index > (size - 1) || index < 0)
return -1;
LinkNode* cur = dummyHead->next;
while(index--)
{
cur = cur->next;
}
return cur->val;
}
//将一个值为val的节点插入到链表中的第一个元素之前
void addAtHead(int val)
{
LinkNode* newnode = new LinkNode(val);
newnode->next = dummyHead->next;
dummyHead->next = newnode;
size++;
}
//将一个值为val的节点追加到链表中作为链表的最后一个元素
void addAtTail(int val)
{
LinkNode* newnode = new LinkNode(val);
LinkNode* cur = dummyHead;
while(cur->next != nullptr)
{
cur = cur->next;
}
cur->next = newnode;
//newnode->next = nullptr;
size++;
}
//将一个值为val的节点插入到链表中下标为index的节点之前。
void addAtIndex(int index, int val)
{
if(index > size) return;
if(index < 0) index = 0;
LinkNode* newnode = new LinkNode(val);
LinkNode* cur = dummyHead;
while(index--)
{
cur = cur->next;
}
newnode->next = cur->next;
cur->next = newnode;
size++;
}
void deleteAtIndex(int index)
{
if(index > (size - 1) || index < 0) return;
LinkNode* cur = dummyHead;
while(index--)
{
cur = cur->next;
}
LinkNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
tmp = nullptr;
size--;
}
//打印链表
void printLink()
{
LinkNode* cur = dummyHead;
while(cur->next != nullptr)
{
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
private:
int size;
LinkNode* dummyHead;
};
C:
typedef struct Node {
int val;
struct Node* next;
} Node;
typedef struct {
int size;
Node* data;
} MyLinkedList;
/** Initialize your data structure here. */
MyLinkedList* myLinkedListCreate() {
MyLinkedList* obj = (MyLinkedList*)malloc(sizeof(MyLinkedList));
Node* head = (Node*)malloc(sizeof(Node));
head->next = NULL;
obj->data = head;
obj->size = 0;
return obj;
}
/** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
int myLinkedListGet(MyLinkedList* obj, int index) {
if (index < 0 || index >= obj->size) return -1;
Node* cur = obj->data->next;
while (index--) {
cur = cur->next;
}
return cur->val;
}
/** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
Node* node = (Node*)malloc(sizeof(Node));
node->val = val;
Node* cur = obj->data;
node->next = cur->next;
cur->next = node;
obj->size++;
}
void myLinkedListAddAtTail(MyLinkedList* obj, int val)
{
Node* node = (Node*)malloc(sizeof(Node));
node->val = val;
Node* cur = obj->data;
while(cur->next != NULL)
{
cur = cur->next;
}
cur->next = node;
node->next = NULL;
obj->size++;
}
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val)
{
Node* node = (Node*)malloc(sizeof(Node));
node->val = val;
Node* cur = obj->data;
if(index < 0 || index > obj->size) return;
else if(index == obj->size) //这种情况是插入到链表的尾端
{
while(cur->next != NULL)
{
cur = cur->next;
}
cur->next = node;
node->next = NULL;
obj->size++;
}
else
{
while (index--) {
cur = cur->next;
}
node->next = cur->next;
cur->next = node;
obj->size++;
}
}
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
if(index < 0 || index >= obj->size) return;
Node* cur = obj->data;
while(index--)
{
cur = cur->next;
}
Node* tmp = cur->next;
cur->next = cur->next->next;
free(tmp);
obj->size--;
}
void myLinkedListFree(MyLinkedList* obj) {
Node* tmp = obj->data;
while(tmp != NULL)
{
Node* n = tmp;
tmp = tmp->next;
free(n);
}
free(obj);
}
Python:
class LinkNode:
def __init__(self,val = 0,next = None):
self.val = val
self.next = next
class MyLinkedList(object):
def __init__(self):
self.dummyHead = LinkNode()
self.size = 0
def get(self, index):
"""
:type index: int
:rtype: int
"""
if index < 0 or index >= self.size:
return -1
cur = self.dummyHead.next
for i in range(index):
cur = cur.next
return cur.val
def addAtHead(self, val):
"""
:type val: int
:rtype: None
"""
self.dummyHead.next = LinkNode(val,self.dummyHead.next)
self.size += 1
def addAtTail(self, val):
"""
:type val: int
:rtype: None
"""
cur = self.dummyHead
while cur.next:
cur = cur.next
cur.next = LinkNode(val)
self.size += 1
def addAtIndex(self, index, val):
"""
:type index: int
:type val: int
:rtype: None
"""
cur = self.dummyHead
if index < 0 or index > self.size:
return
elif index == self.size:
while cur.next:
cur = cur.next
cur.next = LinkNode(val)
elif index < self.size:
for i in range(index):
cur = cur.next
cur.next = LinkNode(val,cur.next)
self.size += 1
def deleteAtIndex(self, index):
"""
:type index: int
:rtype: None
"""
if index < 0 or index >= self.size:
return
cur = self.dummyHead
for i in range(index):
cur = cur.next
cur.next = cur.next.next
self.size -= 1
def printLink(self):
cur = self.dummyHead
while cur.next:
print(cur.val)
注意在插入或者删除结点的操作时,n所指向的都是cur->next,我们需要得到的是n-1所对应的也即是cur,这样进行插入删除操作才不会出错。