# 链表的基本操作

package com.zyf.data;

import java.util.Hashtable;

import org.junit.Test;

/**
*链表的基本操作
* @author zyf
*
*/
Node newNode = new Node(d);
return;
}
while(tmp.next != null){
tmp = tmp.next;
}
tmp.next = newNode;
}
/**
* @param index:删除第index个结点
* @return 成功返回true， 失败返回false
*/
public Boolean deleteNode(int index){
if(index <1 || index > length()){
return false;
}
//删除链表第一个元素
if(index == 1){
return true;
}
int i = 1;
Node curNode = preNode.next;
while(curNode != null){
if(i == index){
preNode.next = curNode.next;
return true;
}
preNode = curNode;
curNode = curNode.next;
i++;
}
return true;
}
/**
* @return 返回结点的长度
*/
public int length(){
int length = 0;
while(tmp != null){
length ++;
tmp = tmp.next;
}
return length;
}
/**
* 对链表进行排序
* 返回排序后的头结点
*/
public Node orderList(){
Node nextNode = null;
int temp = 0;
while(curNode.next != null){
nextNode = curNode.next;
while(nextNode != null){
if(curNode.data > nextNode.data){
temp = curNode.data;
curNode.data = nextNode.data;
nextNode.data = temp;
}
nextNode = nextNode.next;
}
curNode = curNode.next;
}
}
public void printList(){
while(tmp != null){
System.out.println(tmp.data);
tmp = tmp.next;
}
}
@Test
public static void main(String[] args){
System.out.println("listLen = " + list.length());
System.out.println("before order:");
list.printList();
list.orderList();
System.out.println("after order:");
list.printList();
//findElem(1,2);
}
//从链表中删除重复的数据
Hashtable<Integer,Integer> table = new Hashtable<Integer,Integer>();
Node pre = null;
while(tmp!=null){
if(table.containsKey(tmp.data))
pre.next = tmp.next;
else{
table.put(tmp.data, 1);
pre=tmp;
}
tmp = tmp.next;
}
}

while(p != null){
Node q = p;
while(q.next != null){
if(p.data == q.next.data){
q.next = q.next.next;
}else
q = q.next;
}
p = p.next;
}
}
//如何找出单链表中的倒数第k个元素
@Test
if(k<1 || k >this.length())
return null;
for(int i =0 ;i < k-1;i++)
p1 = p1.next;
while(p1 != null){
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
//如何实现链表的反转
Node pPrev = null;
while(pNode != null){
Node pNext = pNode.next;
if(pNext == null)
pNode.next = pPrev;
pPrev = pNode;
pNode = pNext;
}
}
//如何从尾到头输出单链表
}
}
//如何寻找单链表的中间结点
while(p != null && p.next != null && p.next.next != null){
p = p.next.next;
q = q.next;
}
return q;
}
//如何检测一个链表是否有环
if(fast == null){
return false;
}
while(fast!=null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
return true;
}
}
return !(fast == null || fast.next == null);
}
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast) break;
}
if(fast == null || fast.next == null)
return null;
while(slow != fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
//如何在不知道头指针的情况下删除指定结点
public boolean deleteNode(Node n){
if(n == null || n.next == null)
return false;
int tmp = n.data;
n.data = n.next.data;
n.next.data = tmp;
n.next = n.next.next;
return true;
}
//如何判断两个链表是否相交
public boolean isIntersect(Node h1,Node h2){
if(h1 == null || h2 == null)
return false;
Node tail1 = h1;
while(tail1.next != null)
tail1 = tail1.next;
Node tail2 = h2;
while(tail2.next != null){
tail2 = tail2.next;
}
return tail1 == tail2;
}

public static Node getFirstMeetNode(Node h1,Node h2){
if(h1 == null || h2 == null)
return null;
Node tail = h1;
int len1 = 1;
//找到链表h1的最后一个结点
while(tail.next != null){
tail = tail.next;
len1 ++;
}
Node tail2 = h2;
int len2 = 1;
while(tail2.next != null){
tail2 = tail2.next;
len2 ++;
}

if(tail != tail2){
return null;
}
Node t1 = h1;
Node t2 = h2;
//找出较长的链表，先遍历
if(len1 > len2){
int d = len1 = len2;
while(d != 0){
t1 = t1.next;
d--;
}
}
else{
int d = len2 - len1;
while(d != 0){
t2 = t2.next;
d--;
}
}
while(t1 != t2){
t1 = t1.next;
t2 = t2.next;
}
return t1;
}
//.
}

• 本文已收录于以下专栏：

## 【数据结构】 链表的19种基本操作（完整版）

• fanxingzju
• 2014年04月03日 17:11
• 1496

## c++实现单链表基本操作

• u011200403
• 2017年02月13日 19:33
• 1094

## c++ 单链表基本操作

#include #include #include #include #include /*c++实现简单的单链表操作*/ using namespace std; typedef str...
• cfan0801
• 2012年03月13日 21:01
• 24591

## 链表基本操作及其过程详细叙述

• dezhihuang
• 2014年09月07日 10:15
• 8073

## 入门：链表的基本操作

• linwh8
• 2015年11月05日 00:15
• 2414

## 数据结构之链表基本操作总结

• Lily_whl
• 2017年05月11日 18:22
• 1309

## 实例讲解C++ 双链表基本操作

1.概念 　　双向链表也叫双链表，是链表的一种，它的每个数据结点中都有两个指针，分别指向直接后继和直接前驱。所以，从双向链表中的任意一个结点开始，都可以很方便地访问它的前驱结点和后继结点。一般我...
• whChina
• 2016年04月26日 08:09
• 1982

## C++实现链表基本操作

• Kevin_zhai
• 2016年01月10日 21:56
• 37049

## 关于链表操作编程实现的一些总结

• zmajun
• 2015年07月28日 16:25
• 415

## 用java简单的实现单链表的基本操作

• tayanxunhua
• 2013年09月04日 23:41
• 88953

举报原因： 您举报文章：链表的基本操作 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)