补充内容——带头结点的单链表+练习题
Posted 王嘻嘻-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补充内容——带头结点的单链表+练习题相关的知识,希望对你有一定的参考价值。
引言:
实现不带头节点单链表基本功能👉请看链接https://blog.csdn.net/weixin_45699237/article/details/121733085
由于不带头结点的单链表在实现一些功能上边不方便,常常得考虑到头节点是否存在,头节点是否为空的问题,为此,我们引入虚拟头节点,进一步优化我们的代码,也让在单链表在实现某些功能上可以更加简单操作。
package seqlist;
//创建一个头节点
public class SingleLinkedListWithHead
private int size; //当前存储元素个数
private Node dummyHead = new Node(-1);// 虚拟头节点
//添加方法
public void addIndex(int index,int val)
//判断index合法性
if (index<0||index>size)
System.err.println("add index illegal!");
return;
//插入全部是中间节点
Node node = new Node(val);
Node prev = dummyHead;
for (int i = 0; i < index; i++)
prev = prev.next;
node.next = prev.next;
prev.next = node;
size++;
public void addFirst(int val)
addIndex(0,val);
public void addLast(int val)
addIndex(size,val);
public void removeIndex(int index)
if (index<0||index>=size)
System.err.println("remove index illegal!");
return;
Node prev = dummyHead;
for (int i = 0; i < index; i++)
prev = prev.next;
prev.next = prev.next.next;
size--;
public String toString()
String ret = "";
Node node = dummyHead.next;
while (node != null)
ret += node.val;
ret += "->";
node = node.next;
ret += "NULL";
return ret;
package seqlist;
public class Test
public static void main(String[] args)
SingleLinkedListWithHead singleLinkedListWithHead=new SingleLinkedListWithHead();
singleLinkedListWithHead.addFirst(1);
singleLinkedListWithHead.addLast(3);
singleLinkedListWithHead.addIndex(1,3);
System.out.println(singleLinkedListWithHead);//1->3->3->NULL
singleLinkedListWithHead.removeIndex(0);
System.out.println(singleLinkedListWithHead);//3->3->NULL
删除链表重复节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针 。
package seqlist.leetcode;
public class solution
public static void main(String[] args)
ListNode head = build();
solution solution = new solution();
ListNode newHead = solution.deleteDuplication(head);
System.out.print(newHead.toString(newHead));
private static ListNode build()
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(7);
ListNode node3 = new ListNode(7);
ListNode node4 = new ListNode(7);
ListNode node5 = new ListNode(7);
ListNode node6 = new ListNode(8);
ListNode node7 = new ListNode(9);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node7;
return node1;
//删除链表重复节点:在一个排序的链表中,存在重复的结点,
//请删除该链表中重复的结点,重复的结点不保留,返回链表头指针
public ListNode deleteDuplication(ListNode pHead)
if (pHead == null || pHead.next == null)
return pHead;
ListNode dummy = new ListNode(0);//头节点
dummy.next = pHead;
ListNode pre = dummy;
ListNode cur = pHead;
while (cur!=null)
// 如果cur和cur.next的值相等,那么把cur移动到重复节点的最后一个节点
if (cur.next!=null && cur.val == cur.next.val)
while (cur!=null && cur.next!=null && cur.val==cur.next.val)
cur=cur.next;
// 连接pre和cur.next,构造不重复的节点
pre.next=cur.next;
cur=cur.next;
else
// pre和cur都后移一位
pre=pre.next;
cur=cur.next;
return dummy.next;
本节完^_^
以上是关于补充内容——带头结点的单链表+练习题的主要内容,如果未能解决你的问题,请参考以下文章