Linked Lists in Action Chapter 5 introduces the often- used data structure of linked lists. This presentation shows how to implement the most common.

Slides:



Advertisements
Similar presentations
Chapter 5 introduces the often- used data structure of linked lists. This presentation shows how to implement the most common operations on linked lists.
Advertisements

DATA STRUCTURES USING C++ Chapter 5
CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College.
Linked List 1. Introduction to Linked List 2. Node Class 3. Linked List 4. The Bag Class with Linked List.
PRESENTED BY MATTHEW GRAF AND LEE MIROWITZ Linked Lists.
Container Classes A container class is a data type that is capable of holding a collection of items. In C++, container classes can be implemented as.
C Structures and Memory Allocation There is no class in C, but we may still want non- homogenous structures –So, we use the struct construct struct for.
Introduction to Linked Lists In your previous programming course, you saw how data is organized and processed sequentially using an array. You probably.
Reviews for Exam 1 Chapter 1-4 CS 211 Data Structures MHC, 2007.
CSC212 Data Structure - Section FG Lecture 9 Linked Lists Instructor: Zhigang Zhu Department of Computer Science City College of New York.
@ Zhigang Zhu, CSC212 Data Structure - Section FG Lecture 10 The Bag and Sequence Classes with Linked Lists Instructor: Zhigang Zhu Department.
L l Chapter 4 introduces the often- used linked list data structures l l This presentation shows how to implement the most common operations on linked.
Copyright © 2008 Pearson Addison-Wesley. All rights reserved. Chapter 13 Pointers and Linked Lists.
1 Linked Lists It’s a conspiracy!. 2 Linked list: a data structure used to represent an ordered list Consists of a sequence of nodes A node consists of.
Data Structures Using C++ 2E
Lecture 22 Miscellaneous Topics 4 + Memory Allocation.
Copyright © 2008 Pearson Addison-Wesley. All rights reserved. Chapter 13 Pointers and Linked Lists.
Copyright © 2012 Pearson Addison-Wesley. All rights reserved. Chapter 13 Pointers and Linked Lists.
Microsoft Visual C++.NET Chapter 61 Memory Management.
Xiaoyan Li, CSC211 Data Structures Lecture 10 The Bag and Sequence Classes with Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer.
 A Collection class is a data type that is capable of holding a group of items.  In Java, Collection classes can be implemented as a class, along with.
More About Objects and Methods Chapter 5. Outline Programming with Methods Static Methods and Static Variables Designing Methods Overloading Constructors.
Linked Lists Objects->Connected->by->Pointers. What is a Linked List? List: a collection Linked: any individual item points to another item to connect.
Chapter 15 Linked Data Structures Slides prepared by Rose Williams, Binghamton University Kenrick Mock University of Alaska Anchorage Copyright © 2008.
Container Classes  A container class is a data type that is capable of holding a collection of items.  In C++, container classes can be implemented as.
Chapter 5 Linked List by Before you learn Linked List 3 rd level of Data Structures Intermediate Level of Understanding for C++ Please.
1 Chapter 6 Methods for Making Data Structures. 2 Dynamic Arrays in Data Structures In almost every data structure, we want functions for inserting and.
Engineering Classes. Objectives At the conclusion of this lesson, students should be able to: Explain why it is important to correctly manage dynamically.
Copyright © 2014 Pearson Addison-Wesley. All rights reserved. Chapter 9 Pointers and Dynamic Arrays.
DATA STRUCTURE & ALGORITHMS CHAPTER 2: LINKED LIST.
1 Linked Lists Assignment What about assignment? –Suppose you have linked lists: List lst1, lst2; lst1.push_front( 35 ); lst1.push_front( 18 ); lst2.push_front(
1 Linked List. Outline Introduction Insertion Description Deletion Description Basic Node Implementation Conclusion.
Prof. I. J. Chung Data Structure #4 Professor I. J. Chung.
Linked Lists A formal data structure. Linked Lists Collections of data items “lined up in a row” Inserts and deletes can be done anywhere in the list.
Linked Lists Source: presentation based on notes written by R.Kay, A. Hill and C.Noble ● Lists in general ● Lists indexed using pointer arrays ● Singly.
Memory Management.
Chapter 16: Linked Lists.
Pointers and Dynamic Arrays
Pointers and Dynamic Arrays
User-Written Functions
Pointers and Linked Lists
CSC212 Data Structure - Section BC
Pointers and Linked Lists
Linked Lists in Action Chapter 5 introduces the often-used data public classure of linked lists. This presentation shows how to implement the most common.
Introduction to Linked Lists
Edvin von Otter & Todd Barker
The Bag and Sequence Classes with Linked Lists
Map interface Empty() - return true if the map is empty; else return false Size() - return the number of elements in the map Find(key) - if there is an.
Stack Lesson xx   This module shows you the basic elements of a type of linked list called a stack.
Introduction to Linked Lists
Object Oriented Programming COP3330 / CGS5409
Linked List Lesson xx   In this presentation, we introduce you to the basic elements of a linked list.
Binary Search Trees One of the tree applications in Chapter 10 is binary search trees. In Chapter 10, binary search trees are used to implement bags.
Pointers and Linked Lists
[Chapter 4; Chapter 6, pp ] CSC 143 Linked Lists [Chapter 4; Chapter 6, pp ]
Heaps Chapter 11 has several programming projects, including a project that uses heaps. This presentation shows you what a heap is, and demonstrates.
Hash Tables Chapter 12 discusses several ways of storing information in an array, and later searching for the information. Hash tables are a common.
CISC/CMPE320 - Prof. McLeod
Introduction to C++ Linear Linked Lists
Hash Tables Chapter 12 discusses several ways of storing information in an array, and later searching for the information. Hash tables are a common.
Lists.
Data Structures & Algorithms
slides created by Marty Stepp
Using a Queue Chapter 8 introduces the queue data type.
Using a Queue Chapter 8 introduces the queue data type.
EECE.3220 Data Structures Instructor: Dr. Michael Geiger Spring 2019
Linked Lists in Action Chapter 5 introduces the often- used data structure of linked lists. This presentation shows how to implement the most common.
slides created by Ethan Apter
四時讀書樂 (春) ~ 翁森 山光照檻水繞廊,舞雩歸詠春風香。 好鳥枝頭亦朋友,落花水面皆文章。 蹉跎莫遣韶光老,人生唯有讀書好。
Presentation transcript:

Linked Lists in Action Chapter 5 introduces the often- used data structure of linked lists. This presentation shows how to implement the most common operations on linked lists. This lecture shows three linked list operation in detail. The operations are: 1. Adding a new node at the head of a linked list. 2. Adding a new node in the middle of a linked list. 3. Removing a node from a linked list. The best time for this lecture is just after the students have been introduced to linked lists (Section 5.1), and before the complete linked list toolkit has been covered (Section 5.2). CHAPTER 5 Data Structures and Other Objects

Declarations for Linked Lists For this presentation, nodes in a linked list are objects, as shown here. 15 data_field class node { public: typedef double value_type; ... private value_type data_field; node *link_field; }; link_field 10 data_field Here is a typical class declaration that can be used to implement a linked list of integers, as described in Section 5.1 of the text. Note that we have used a class rather than a struct. In a struct, the data and link members would typically be public, but there is more difficulty in ensuring that no part of a linked list is changed via a const pointer to a node. 7 link_field data_field null link_field

Declarations for Linked Lists The data_field of each node is a type called value_type, defined by a typedef. 15 data_field class node { public: typedef int value_type; ... private value_type data_field; node *link_field; }; link_field 10 data_field Within the node class, there is a type definition for a type called called "value_type". The purpose of the value_type is to tell us what kind of data resides in each of the nodes on the linked list. For example, if we want to create a linked list of real numbers, then we would declare typedef double Item; In this example, we want a linked list of integers, so we have declared typedef int value_type; As you can see, the value_type is used in the node declaration as the data type of a member variable called data_field. In the picture, I have drawn three nodes which might be part of a linked list of integers. The data_field portions of these nodes contain the integers 10, 15 and 7. 7 link_field data_field null link_field

Declarations for Linked Lists Each node also contains a link_field which is a pointer to another node. 15 data_field class node { public: typedef int value_type; ... private value_type data_field; node *link_field; }; link_field 10 data_field Also inside each node is a second member variable called link_field. The purpose of the link_field is to contain a pointer to the next node in the sequence of nodes. Question: What appears in the link_field of the final node in a linked list such as this? Answer: A special pointer value called null, which means "This pointer doesn't point to anything." This makes sense because there is no node after the final node. 7 link_field data_field null link_field

Declarations for Linked Lists A program can keep track of the front node by using a pointer variable such as head_ptr in this example. Notice that head_ptr is not a node - - it is a pointer to a node. 15 data_field link_field 10 data_field When a linked list is implemented, we generally keep track of the first node by using a special pointer called the "head pointer". The head pointer points to the first node in the linked list. It is important to remember that head_ptr is not actually a node. It is just a single pointer, which points to the first actual node. 7 link_field data_field null head_ptr link_field

Declarations for Linked Lists A program can keep track of the front node by using a pointer variable such as head_ptr. Notice that node objects are dynamically allocated. We represent the empty list by storing NULL in the head pointer. Don’t dereference the NULL pointer Also remember that it is possible for a linked list to have no nodes at all. This situation is called the "empty list". Even with the empty list, we still have a head pointer, but the head pointer has no nodes to point to. So, instead of pointing to something, the head pointer of the empty list contains that special value, null. null head_ptr

Node Constructor node( Object types must provide a default constructor const value_type& init_data = value_type(), const node* init_link = NULL; ); Object types must provide a default constructor Primitive types are provided with pseudo-default- constructor that provides a default value (usually 0)

Other member functions // Member functions to set the data and link fields: void set_data(const value_type& new_data) { data_field = new_data; } void set_link(node* new_link) { link_field = new_link; } // Constant member function to retrieve the current data: value_type data( ) const { return data_field; } // Two slightly different member functions to retrieve the current link: const node* link( ) const { return link_field; } node* link( ) { return link_field; } There are two version of link One is used when the receiving context will not attempt to change the list The other is used if the receiving context is planning on changing the list

The -> operator If p points to a node, then how to call the data function *p.data() will not work, since the . Operator has higher precedence than * (*p).data(); p->data() is just a more convenient shorthand

The Linked List Toolkit std::size_t list_length(const node *head_ptr); void list_head_insert(node *&head_ptr, const node::value_type &entry); void list_insert(node *previous_ptr, const node::value_type &entry); node *list_search(node *head_ptr, const node::value_type &target); const node *list_search (const node *head_ptr, const node::value_type &target); node *list_locate(node *head_ptr, std::size_t position); const node *list_locate(const node *head_ptr, std::size_t position); void list_head_remove(node *&head_ptr); void list_remove(node *previous_ptr); void list_clear(node *&head_ptr); void list_copy(const node *source_ptr, node *&head_ptr, node *&tail_ptr);

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry); We want to add a new entry, 13, to the front of the linked list shown here. 15 In this lecture, I'll show you the workings of three functions to manipulate linked lists. The first function is called head_insert. The purpose of the function is to insert a new entry at the front of a linked list. The first parameter is the head point of the linked list declared here as: node*& head_ptr Notice that this is a pointer to a node, but it is also a reference parameter (indicated by the “&”). The reason for the reference parameter is that the function will make the head pointer point to a new node (containing the new entry)--and we want the change to affect the actual head pointer back in the calling program. The new entry itself is the the second parameter, declared here as: const node::value_type& entry This is a const reference parameter because the function uses the new entry (for the data part of a new node), but the function does not change the value of the parameter. In a prototype of a function such as this, we must use the entire data type (node::value_type) and not just value_type. In order to develop the function, we'll trace through a small example. In the example the new entry (number 13) is being added to a list which already has three entries (10, 15 and 7). 10 7 13 null entry head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry); Create a new node, pointed to by a local variable insert_ptr. insert_ptr 15 The first step of the list_head_insert function is to create a new node. In order to create the new node, we use a local variable which I have called insert_ptr, which is a pointer to a node. Think of insert_ptr as being a "temporary insertion pointer" because we won't need it any more once the new node is actually placed in the list. The idea is to get insert_ptr to point to the newly-created node when this node is first created. Do you remember enough from Chapter 4 to know the C++ statement which will create the new node and point insert_ptr at this new node? 10 7 entry 13 null head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry); insert_ptr = new node; insert_ptr 15 Here is the C++ statement: insert_ptr = new node; The statement creates a new node, and points the local variable insert_ptr at this newly-created node. 10 7 entry 13 null head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry); insert_ptr = new node; Place the data in the new node's data_field. insert_ptr 13 15 Once the new node has been created, we need to place values in the new node's member variables. The first member variable is the new node's data field, where we are supposed to place a copy of the entry. 10 7 13 null entry head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry); insert_ptr = new node; Place the data in the new node's data_field. Connect the new node to the front of the list. insert_ptr 13 15 The third step of head_insert is to connect the new node to the rest of the existing list. In other words, we will place a pointer into the link member variable of the new node. 10 7 13 null entry head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry); insert_ptr = new node(entry, head_ptr); insert_ptr 13 The correct new node can be completely created in one step by calling an appropriate node constructor. 15 This shows how creating the new node and filling in its two values can be done with one C++ statement, simply by calling the appropriate node constructor. This node constructor and other node member functions are described in Section 5.1 of the textbook. 10 7 13 null entry head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry); insert_ptr = new node(entry, head_ptr); Make the old head pointer point to the new node. insert_ptr 13 15 The list_head_insert function needs one last step: Making the head pointer point to the newly-created node. This will be an assignment statement. Can you write the statement before I move to the next slide? 10 7 13 null entry head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry); insert_ptr = new node(entry, head_ptr); head_ptr = insert_ptr; insert_ptr 13 15 This assignment statement makes head_ptr point to the same place that insert_ptr already points to. 10 7 13 null entry head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry); insert_ptr = new node(entry, head_ptr); head_ptr = insert_ptr; 13 15 When the list_head_insert function returns, the linked list will have a new node (containing 13 in this example). Notice that when the function finishes, the local variable named insert_ptr no longer exists. But the newly created node does still exist, and the head pointer points to the newly created node. One warning: You have read about the delete function in C++, which is used to destroy nodes. Never call delete when you are adding a new node to a linked list! The only time that delete is called is when you want to have fewer nodes, not when you want to have more nodes. When the function returns, the linked list has a new node at the front. 10 7 null head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry) { node *insert_ptr; insert_ptr = new node(entry, head_ptr); head_ptr = insert_ptr; } Here's the complete declaration of the list_head_insert function. Can you find these things: -- the declaration of the local variable, insert_ptr -- the place where the new node is actually created? By the way, the word "created" is probably too strong a word. No new memory is actually created. What does happen is that a portion of memory is set aside for the new operator to use. This portion of memory is called the "heap". Whenever the new operator is called, part of the heap is provided for your new node.

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry) { node *insert_ptr; insert_ptr = new node(entry, head_ptr); head_ptr = insert_ptr; } Does the function work correctly for the empty list ? Before we finish the example, we should check one last thing. Does the function work correctly if the list is initially empty? In other words, if the head pointer is null, will the function manage to correctly add the first node of the list? We can check with an example...

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry) { node *insert_ptr; insert_ptr = new node(entry, head_ptr); head_ptr = insert_ptr; } Does the function work correctly for the empty list ? ...as shown here. In this example, the head pointer is null, and the new entry is 13. 13 null entry head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry) { node *insert_ptr; insert_ptr = new node(entry, head_ptr); head_ptr = insert_ptr; } The next statement of the function allocates a new node, and places the number 13 in the data field of the new node. The link field of the new node is given its value from the old head pointer, which is just what we want in this case (it puts null in the link field). insert_ptr 13 13 null entry null head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry) { node *insert_ptr; insert_ptr = new node(entry, head_ptr); head_ptr = insert_ptr; } The function's last statement makes the head pointer point to the new node. insert_ptr 13 13 entry null head_ptr

Inserting a Node at the Front void list_head_insert(node*& head_ptr, const node::value_type& entry) { node *insert_ptr; insert_ptr = new node(entry, head_ptr); head_ptr = insert_ptr; } When the function returns, the linked list has one node. So, as you can see, when the function finally returns, there is one node in the linked list, and the head pointer correctly points to the new node. In other words, our function works just fine, even if we are adding the first node to a previously empty list. Note: The implementation in Section 5.2 of the textbook is slightly shorter, making do without the local variable insert_ptr. How do you think it does that? 13 null head_ptr

Caution! Always make sure that your linked list functions work correctly with an empty list. This slide is just a warning: Always make sure that your linked list functions work sensibly with the empty list. If you run into a function that fails for the empty list, then you will need to modify the function by adding some special code to deal with a null head pointer. EMPTY LIST

Pseudocode for Inserting Nodes Nodes are often inserted at places other than the front of a linked list. There is a general pseudocode that you can follow for any insertion function. . . That's the end of our list_head_insert function. There are two more linked list functions that we'll look at today. Actually, we'll just look at typical pseudocode for the next two functions. The first of these functions is a function for inserting a new node at a place other than the front of a linked list. Actually, the pattern that we'll follow will be capable of inserting a new node at any location in a linked list: Maybe at the front, maybe in the middle, maybe at the end. For example, you might be keeping the nodes sorted from smallest integer to largest integer. Or perhaps there is some other method to your insertions. The pseudocode that I'll describe will work for any method that you might think of. Really!

Pseudocode for Inserting Nodes Determine whether the new node will be the first node in the linked list. If so, then there is only one step: list_head_insert(head_ptr, entry); The first step of the pseudocode is to determine whether the new node will be inserted as the first node of the linked list. If so, then you can simply call the head_insert function which we already wrote, as shown here.

Pseudocode for Inserting Nodes Determine whether the new node will be the first node in the linked list. If so, then there is only one step: list_head_insert(head_ptr, entry); The function we already wrote There are three parts to calling the function we already wrote. First, of course, is the function name: head_insert.

Pseudocode for Inserting Nodes Determine whether the new node will be the first node in the linked list. If so, then there is only one step: list_head_insert(head_ptr, entry); A pointer to the head of the list Next is the first argument, which is the pointer to the head of the linked list.

Pseudocode for Inserting Nodes Determine whether the new node will be the first node in the linked list. If so, then there is only one step: list_head_insert(head_ptr, entry); The data to put in the new node And finally is the data for the new node. So, this function call will add the new data at the front of an existing linked list.

Pseudocode for Inserting Nodes Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the node which is just before the new node's position. On the other hand, if the new data does not belong at the front of the linked list, then you will start by setting up a pointer that I call previous_ptr. This pointer must be set up to point to the node which is just before the new node's position.

Pseudocode for Inserting Nodes Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the node which is just before the new node's position. In this example, the new node will be the second node 10 As an example, suppose that we want to add 13 to this list, and we want to keep all the entries in order from largest to smallest. We don't want to put 13 first on this list, because 13 is smaller than 15. So, we proceed to set up the previous_ptr to point to the node which is just before the position where 13 should be inserted. In this example, previous_ptr would be set up to point to the first node of the linked list (containing 15). The 13 will be inserted as the new second node of the list (after the 15, but before the 10). previous_ptr 15 7 null head_ptr

Pseudocode for Inserting Nodes Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the node which is just before the new node's position Look at the pointer which is in the node *previous_ptr 10 In order to insert the new node at the proper place, we need to examine the link field which is in the node pointed to by previous_ptr. This link field is highlighted in the picture. Question: What is the name of this link field? Can you write the answer before I move to the next slide? previous_ptr 15 7 What is the name of this orange pointer ? null head_ptr

Pseudocode for Inserting Nodes Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the node which is just before the new node's position This pointer is called previous_ptr->link_field (although this name may be private to the node) 10 As you see, the highlighted pointer is called previous_ptr->link_field. This member variable is most likely private for the node class, but never mind about that just now. What you should pay attention to now: Start at previous_ptr, follow the pointer, and select the link field from the record. There is a reason that previous_ptr->link_field is important to us... previous_ptr 15 7 What is the name of this orange pointer ? null head_ptr

Pseudocode for Inserting Nodes Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the node which is just before the new node's position previous_ptr->link_field points to the head of a small linked list, with 10 and 7 10 ...as you can see here, previous_ptr->link_field actually points to the first node of a small linked list. The small linked list contains 10 and 7 -- and more important, we want to add the new entry at the front of this small linked list. previous_ptr 15 7 null head_ptr

Pseudocode for Inserting Nodes Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the node which is just before the new node's position. 13 The new node must be inserted at the front of this small linked list. 10 Here is a small challenge: Can you write just one C++ statement which will insert the new node at the front of the small linked list? Use the name entry for the name of the data that you are placing in the new node... ...think about what functions you already have... previous_ptr 15 7 Write one C++ statement which will do the insertion. null head_ptr

Pseudocode for Inserting Nodes Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the node which is just before the new node's position. 13 10 list_head_insert(previous_ptr->link_field, entry); Did anyone come up with this solution? By calling the list_head_insert function, we can insert entry at the front of the small linked list. The key is that we have the pointer previous_ptr->link_field which points to the head of the small linked list. One potential problem with this solution is that the link_field is probably a private member variable of the node class. In this case... previous_ptr 15 7 What might cause this statement to fail to compile? null head_ptr

Pseudocode for Inserting Nodes Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the node which is just before the new node's position. 13 10 list_head_insert(previous_ptr->link( ), entry); ...the node class will provide some other way to obtain that pointer, such as the link() member function defined in Section 5.1 of the text. With this in mind, we can still call list_head_insert, as shown in this slide. previous_ptr 15 7 Use a node member function to get the link field if needed. null head_ptr

Pseudocode for Inserting Nodes Determine whether the new node will be the first node in the linked list. If so, then there is only one step: list_head_insert(head_ptr, entry); Otherwise (if the new node will not be first): Set a pointer named previous_ptr to point to the node which is just before the new node's position. Make the function call: Here is the complete pseudocode for adding a new node. Remember: this pseudocode can be used for many different methods of inserting, such as keeping nodes in order from largest to smallest. list_head_insert(previous_ptr->link( ), entry);

Pseudocode for Inserting Nodes The process of adding a new node in the middle of a list can also be incorporated as a separate function. This function is called list_insert in the linked list toolkit of Section 5.2. Section 5.2 gives a collection of function for manipulating linked lists. One of these functions, called list_insert, places a new node in the middle of a linked list.

Pseudocode for Removing Nodes Nodes often need to be removed from a linked list. As with insertion, there is a technique for removing a node from the front of a list, and a technique for removing a node from elsewhere. We’ll look at the pseudocode for removing a node from the front of a linked list. Do you have energy for one more function? Or at least for some pseudocode. I’ll just show you how to remove a node from the front of a linked list. You can figure out the code for removing other nodes, or you can read the solution in Section 5.2.

Removing the Head Node Start by setting up a temporary pointer named remove_ptr to the head node. As we did before, we'll use an example to illustrate the pseudocode. In the example, we want to delete the head node which contains 13. The first part of the pseudocode sets up a local variable named remove_ptr to point to the node that we want to remove. remove_ptr 13 10 15 7 null head_ptr

Removing the Head Node Set up remove_ptr = head_ptr. Draw the change that this statement will make to the linked list. Since we are removing the first node of the list, we need to change the place where head_ptr is pointing. Can you tell me where the head_ptr will point after the assignment statement that is shown here? Be quick, because I am about to change the slide... remove_ptr 13 10 15 7 null head_ptr

Removing the Head Node Set up remove_ptr = head_ptr. head_ptr = remove_ptr->link( ); As you can see, the assignment statement makes the head pointer point to the second node of the list. remove_ptr 13 10 15 7 null head_ptr

Removing the Head Node Set up remove_ptr = head_ptr. head_ptr = remove_ptr->link( ); delete remove_ptr; // Return the node's memory to heap. There is one last statement that the removal function should execute: delete remove_ptr; This takes the node which is pointed to by remove_ptr and returns it to the heap, so that the memory can be reused at some later date. If you forget this step, then the memory won't be able to be reused -- a situation that's called a "heap leak". Remember this rule of thumb: If you are adding a node to a linked list, then make sure that new ... is called exactly once. If you are removing a node from a linked list, then make sure that delete ... is called exactly once. remove_ptr 13 10 15 7 null head_ptr

Removing the Head Node Here’s what the linked list looks like after the removal finishes. Notice that the local variable, remove_ptr, is no longer around. 10 15 7 null head_ptr

Summary It is easy to insert a node at the front of a list. The linked list toolkit also provides a function for inserting a new node elsewhere It is easy to remove a node at the front of a list. The linked list toolkit also provides a function for removing a node elsewhere--you should read about this function and the other functions of the toolkit. A quick summary . . .