デザインのリストを実装します。あなたは、単一または二重リンクリストを使用するように選択することができます。リスト内の1つのノードには、2つのプロパティを持つ必要がありますval
とnext
。val
ノードの現在値であり、next
次のノード/参照を指し示すポインタです。二重リンクリストを使用するには、属性も必要ですprev
リンクリスト内のノードを示すために。リスト内のすべてのノードがあると仮定0-index
して。
リストクラスでこれらの機能を実装します:
get(index)
:インデックス・ノードのリストの値を取得します。インデックスが無効の場合は、-1が返されます。
addAtHead(val)
:リンクされたリストの最初の要素の前に値を追加するval
ノード。挿入後、新しいノードは、リストの最初のノードになります。
addAtTail(val)
:ヴァルへのノードは、リストの最後の要素に追加しました。
addAtIndex(index,val)
:最初のリンクリストのノードインデックスの前に値を追加するval
ノード。インデックスは、リストの長さに等しい場合、ノードはリストの最後に追加されます。インデックスは、リストの長さより大きい場合、ノードが挿入されません。インデックスが0未満である場合、そのノードは、ヘッドに挿入されます。
deleteAtIndex(index)
:インデックスインデックスが有効であれば、インデックス・ノードのリストを削除します。
例:
MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3
linkedList.get(1); //返回2
linkedList.deleteAtIndex(1); //现在链表是1-> 3
linkedList.get(1); //返回3
ヒント:
- すべての
val
値は、$の$ [1、1000年]です。 - $ [1、1000年]内の$での操作の数。
- ビルトインは使用しないでください
LinkedList
ライブラリを。
コード
struct myListNode
{
int val;
myListNode* next;
myListNode() :val(-1), next(nullptr) {}
};
class MyLinkedList {
public:
int m_size;
myListNode* m_head;
myListNode* m_tail;
public:
/** Initialize your data structure here. */
MyLinkedList() :m_size(0)
{
m_head = new myListNode();
}
/** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
int get(int index)
{
if (index > m_size - 1 || index < 0)
{
return -1;
}
myListNode* p = m_head->next;
while (index != 0)
{
p = p->next;
--index;
}
//std::cout << p->val;
return p->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 addAtHead(int val)
{
myListNode* newNode = new myListNode();
newNode->next = m_head->next;
m_head->next = newNode;
newNode->val = val;
m_size += 1;
}
/** Append a node of value val to the last element of the linked list. */
void addAtTail(int val)
{
myListNode* lastNode = new myListNode();
lastNode->val = val;
myListNode* p = m_head;
int len = m_size;
while (len != 0)
{
p = p->next;
--len;
}
p->next = lastNode;
lastNode->next = NULL;
m_size += 1;
}
/** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */
void addAtIndex(int index, int val)
{
if (index > m_size) return;
if (index == m_size)
{
addAtTail(val);
return;
}
if (index < 0)
{
addAtHead(val);
return;
}
myListNode* newNode = new myListNode();
myListNode* p = m_head;
while (index != 0)
{
p = p->next;
--index;
}
newNode->next = p->next;
p->next = newNode;
newNode->val = val;
m_size += 1;
}
/** Delete the index-th node in the linked list, if the index is valid. */
void deleteAtIndex(int index)
{
if (index > m_size - 1 || index < 0) return;
myListNode* p = m_head;
while (index != 0)
{
p = p->next;
--index;
}
myListNode* delNode = p->next;;
p->next = p->next->next;
m_size -= 1;
delete delNode;
}
};